asynchroner Aufruf in Konstruktoren: Ein unmögliches Endeavor
asynchrones Programmieren unter Verwendung von Async/Awesait sind allgemein geworden, aber ihre Anwendung in einer Konstruktor -Funktion hebt eine faszinierende Herausforderung an. Betrachten Sie den folgenden Code-Snippet:
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 = `leider schlägt dieser Code mit der Fehlermeldung fehl:
Klassenkonstruktor ist möglicherweise keine asynchronisierte MethodeDer Grund dafür ist grundlegend: Eine Konstruktorfunktion ist für die Initialisierung und Rückgabe einer Objektinstanz verantwortlich. Das asynchrische Schlüsselwort wandelt jedoch eine Funktion in einen Promise -Generator um, was dazu führt, dass die Funktion ein Versprechen anstelle des Objekts selbst zurückgibt. Dies schafft einen inhärenten Konflikt.
enthüllt die Unmöglichkeit
Das Missverständnis ergibt sich aus der wahrgenommenen Ähnlichkeit zwischen Async/Warten und Versprechen. Während Async/Auseait syntaktischen Zucker für die Arbeit mit Versprechen liefert, verändert es das zugrunde liegende Verhalten nicht. Versprechen repräsentieren asynchrone Operationen, die entweder auflösen oder ablehnen, um einen Wert zu erzeugen.
Im Gegensatz dazu muss eine Konstruktorfunktion das konstruierte Objekt zurückgeben. Diese unveränderliche Anforderung kann nicht mit dem Versprechen-produzierenden Verhalten einer asynchronen Funktion versöhnt werden. Asynchrone Aufgaben ausführen. Die Objektinstanz kann nur in dieser Funktion verwendet werden.
var myobj = new myclass (); myobj.init (function () { // drinnen hier kannst du myobj benutzen });
Builder muster
: Anstatt den Konstruktor direkt anzurufen, verwenden Sie eine Builder -Funktion, um eine Objektinstanz zu erstellen. Die Erbauerfunktion gibt ein Versprechen zurück, das sich an die Objektinstanz entscheidet, sobald alle asynchronen Aufgaben abgeschlossen sind. // myobj wird durch das Versprechen zurückgegeben, nicht vom Konstruktor oder Erbauer }); // mit asynchronen/wartet: asynchrische Funktion foo () { var myobj = warte myclass.build (); }
- Beachten Sie, dass die oben genannten Beispiele, während die obigen Beispiele im Builder -Muster verwendet werden, auch Rückrufe verwendet werden können. Daher können Sie Methoden nicht direkt in statischen Funktionen aufrufen. Beziehen Sie sich stattdessen auf Methoden unter Verwendung des Klassennamens oder deklarieren Sie sie als statische Methoden.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3