2016-04-01 10 views
8

Wie die Frage angegeben. Will ich dies tun dürfen:Kann async/await für Konstruktoren verwendet werden?

class MyClass { 
    async constructor(){ 
     return new Promise() 
    } 
} 
+1

async/warte ist nicht Teil von ES7. –

+0

Selbst wenn es möglich wäre (Hinweis: ist es nicht), [wäre es eine schreckliche Praxis] (http://stackoverflow.com/q/24398699/1048572) – Bergi

+0

Eine mögliche Lösung wäre, ein 'statisches async' hinzuzufügen Funktion, die die asynchrone Initialisierung durchführt, bevor die Instanz von 'MyClass' tatsächlich erstellt wird. –

Antwort

10

Ohne zu versuchen, Glücks sagen über zukünftige Entscheidungen, lassen Sie uns auf Praktikabilität konzentrieren und was bereits bekannt ist.

ES7, wie ES6, bevor es versuchen wird, eine rückwärtskompatible Erweiterung der Sprache zu sein. In Anbetracht dessen ist eine abwärtskompatible Konstruktorfunktion im Wesentlichen eine reguläre Funktion (mit einigen Laufzeitbeschränkungen), die mit dem Schlüsselwort new aufgerufen werden soll. Wenn das passiert, wird der Rückgabewert der Funktion speziell behandelt, insbesondere werden Nicht-Objekt-Rückgabewerte ignoriert und das neu zugeordnete Objekt wird zurückgegeben, während Objekt-Rückgabewerte unverändert zurückgegeben werden (und das neu zugeordnete Objekt verworfen wird). Damit würde Ihr Code dazu führen, dass ein Versprechen zurückgegeben wird und keine "Objektkonstruktion" stattfindet. Ich sehe die Praktikabilität nicht und ich nehme an, wenn jemand sich die Zeit nimmt, herauszufinden, was mit einem solchen Code zu tun ist, wird er abgelehnt.

+0

Macht Sinn. Dies ist im Vorschlag nicht klar. Ich habe mich gefragt, weil Sie immer noch einen Rückgabewert im Konstruktor verwenden können, damit Sie Ihre Instanz nicht erhalten. – wintercounter

+0

Ich hatte nicht wirklich die Möglichkeit, den Vorschlag durchzugehen, daher meine hypothetische Antwort, aber ich bin ziemlich zuversichtlich, dass dies als statischer Codefehler definiert wird. – Amit

+0

Wenn sie es hinzufügen würden, müssten sie meiner Meinung nach auch eine Art der Definition einer asynchronen Klasse hinzufügen, so dass Sie die Konstruktorfunktion abwarten könnten (was sich nicht gut anhört), um das von Amit präsentierte Problem zu umgehen. –

9

Auf den Punkt gebracht:

  1. Constructor ist eine Funktion, die ein konkretes Objekt bereitstellen muss.
  2. Async gibt ein Versprechen zurück; genau entgegengesetzt der Konkretheit.
  3. async constructor ist konzeptionell widersprüchlich.
7

auf zu erweitern, was sagte Patrick Roberts, können Sie nicht tun, was Sie fordern, aber Sie können wie diese stattdessen etwas tun:

class MyClass { 
    constructor() { 
    //static initialization 
    } 

    async initialize() { 
    await WhatEverYouWant(); 
    } 

    static async create() { 
    const o = new MyClass(); 
    await o.initialize(); 
    return o; 
    } 
} 

dann in Ihrem Code erstellen Sie Ihr Objekt wie folgt:

const obj = await MyClass.create(); 
1

Sie ein Versprechen aus dem Rückgabewert zu bekommen, und warten auf das:

class User { 
 
    constructor() { 
 
    this.promise = this._init() 
 
    } 
 
    
 
    async _init() { 
 
    const response = await fetch('https://jsonplaceholder.typicode.com/users') 
 
    const users = await response.json() 
 
    this.user = users[Math.floor(Math.random() * users.length)] 
 
    } 
 
} 
 

 
const u = new User() 
 
u.promise.then(() => { 
 
    $('#result').text(JSON.stringify(u.user, null, 2)) 
 
}).catch(err => { 
 
    console.error(err) 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<pre id="result"><code></code></pre>

Verwandte Themen