Heim >Web-Frontend >js-Tutorial >Warum kann Async/Await nicht in JavaScript-Konstruktoren verwendet werden?
Asynchroner Aufruf innerhalb von Konstruktoren: Ein unmögliches Unterfangen
Asynchrone Programmierung mit async/await ist alltäglich geworden, aber ihre Anwendung innerhalb einer Konstruktorfunktion nimmt zu eine faszinierende Herausforderung. Betrachten Sie den folgenden Codeausschnitt:
customElements.define('e-mail', class extends HTMLElement { async constructor() { super() let uid = this.getAttribute('data-uid') let message = await grabUID(uid) const shadowRoot = this.attachShadow({mode: 'open'}) shadowRoot.innerHTML = ` <div>
Leider schlägt dieser Code mit der Fehlermeldung fehl:
Der Klassenkonstruktor ist möglicherweise keine asynchrone Methode
Der Grund dafür ist Grundlegend: Eine Konstruktorfunktion ist für die Initialisierung und Rückgabe einer Objektinstanz verantwortlich. Das Schlüsselwort async wandelt jedoch eine Funktion in einen Promise-Generator um, was dazu führt, dass die Funktion ein Promise anstelle des Objekts selbst zurückgibt. Dadurch entsteht ein inhärenter Konflikt.
Enthüllung der Unmöglichkeit
Das Missverständnis ergibt sich aus der wahrgenommenen Ähnlichkeit zwischen Async/Warten und Versprechen. Während async/await syntaktischen Zucker für die Arbeit mit Versprechen liefert, ändert es nicht das zugrunde liegende Verhalten. Versprechen stellen asynchrone Operationen dar, die entweder aufgelöst oder abgelehnt werden, um einen Wert zu erzeugen.
Im Gegensatz dazu muss eine Konstruktorfunktion das Objekt zurückgeben, das erstellt wird. Diese unveränderliche Anforderung kann nicht mit dem vielversprechenden Verhalten einer asynchronen Funktion in Einklang gebracht werden.
Workaround-Strategien
Um diese Einschränkung zu überwinden, sollten Sie die Verwendung eines der folgenden Entwurfsmuster in Betracht ziehen :
var myObj = new myClass(); myObj.init(function() { // inside here you can use myObj });
myClass.build().then(function(myObj) { // myObj is returned by the promise, not by the constructor or builder }); // with async/await: async function foo () { var myObj = await myClass.build(); }
Beachten Sie, dass in den obigen Beispielen zwar Versprechen im Builder-Muster verwendet werden, aber auch Rückrufe verwendet werden können.
Überlegungen zu statischen Funktionen
Es ist wichtig zu beachten, dass das Schlüsselwort this innerhalb statischer Funktionen dies tut beziehen sich nicht auf das instanziierte Objekt, sondern auf die Klasse selbst. Daher können Sie Methoden nicht direkt innerhalb statischer Funktionen aufrufen. Verweisen Sie stattdessen auf Methoden mithilfe des Klassennamens oder deklarieren Sie sie als statische Methoden.
Das obige ist der detaillierte Inhalt vonWarum kann Async/Await nicht in JavaScript-Konstruktoren verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!