Sind JavaScript ES6-Klassen mit asynchronen Codebasen verwendbar?
Was kann ES6-Klassen bieten, als ein Muster der Organisation, um asynchronen code. Unten ist ein Beispiel mit ES7 async/await, kann ein ES6-Klasse haben eine asynchrone Methode oder Konstruktor im ES7?
Kann ich tun:
class Foo {
async constructor() {
let res = await getHTML();
this.res = res
}
}
Ist-und falls nicht, wie sollte ein Konstruktor, der Arbeit, der dies tut?
class Foo {
constructor() {
getHTML().then( function (res) {
this.res = res
}
}
}
Wenn keines dieser Muster arbeiten, kann ein Konstruktor (und darüber hinaus Klassen) in einem ES6 class
unterstützen jede form von Asynchronität, die arbeitet auf den Zustand des Objekts? Oder sind Sie nur für eine rein synchrone code-Basen? Die obigen Beispiele sind in den Konstruktor, aber Sie brauchen nicht zu sein.. Schieben das problem nach unten eine weitere Ebene..
class Foo {
myMethod () {
/* Can I do anything async here */
}
}
Oder, mit einem getter...
class Foo {
get myProp() {
/* Is there any case that this is usefully asynchronous */
}
}
Nur Beispiele, die ich denken konnte, zu etwas laufen parallel innerhalb der gleichen Methode/Konstruktor/getter, aber um das ganze zu beheben vor dem Abschluss. Ich bin nur verwirrt, weil es scheint, mit allen push-to-vollständig asynchrone Bibliotheken, dies dient nur zu verwirren Dinge. Außer lehrbuch-Beispiele, ich kann nicht finden, eine Anwendung, die Sie sind nützlich für die.
InformationsquelleAutor der Frage Evan Carroll | 2016-05-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, das ist ein syntax Fehler - genau wie
constructor* ()
. Ein Konstruktor ist eine Methode, die nichts zurückgibt (kein Versprechen, keine Lichtmaschine), nur initialisiert die Instanz.Solch ein Konstruktor darf nicht existieren, siehe Ist es schlechte Praxis, um eine Konstruktor-Funktion zurückzukehren ein Versprechen?
Ja, Sie können verwenden Sie asynchrone Methoden (auch bei der vorgeschlagenen
async
syntax) auf Klassen-und Getter können Rendite verspricht als gut.Allerdings werden Sie brauchen, um zu entscheiden, was passieren soll, wenn eine Methode aufgerufen wird, während ein asynchrones Prozess noch aktiv ist. Wenn Sie es wünschen, um die Sequenz alle Ihre Vorgänge, speichern Sie Ihre Instanz ist-Zustand innen eine Verheißung für das Ende der Sequenz, können Sie die Kette auf. Oder, wenn Sie wollen, zu ermöglichen parallele Operationen, der beste Ansatz ist, um Ihren Instanzen unveränderlich und geben ein Versprechen für eine andere Instanz.
InformationsquelleAutor der Antwort Bergi
ECMAScript-2017 ist vorgesehen, den Klassen von async-Methoden.
Aufrufen einer anderen async oder Versprechen-Rückkehr-Funktion ist eine one-liner!
Den ausdrucksstarken code liest ohne Unterbrechung von oben nach unten, unabhängig von der latenten Ausführung
Wenn Sie Rückrufe, alternative Fehler-Handler, parallele Ausführung oder andere unerfüllte Bedürfnisse, instanziieren verspricht in der Funktion Körper. Ist es besser, den code in der Funktion Körper, anstatt in ein Versprechen Testamentsvollstrecker, und beachten Sie, dass es gibt keine try-catch-Verpackung callback-code: tun Sie weiter nichts.
Die async-Methode zurückgeben kann, ein Versprechen, ein regulärer Wert, oder werfen
Die callback-apis, die Node.js die Menschen zu dieser Liebe, werden wir hassen mit einer Leidenschaft: Sie müssen alle eingewickelt in verspricht
Die Schönheit von async/await ist, dass Fehler, sprudeln implizit
Wenn beschränkt auf ECMAScript 2015 und nicht async, Rendite Versprechen Werte:
Dieser ECMAScript 2015 version ist das, was Sie wirklich zu Fragen, jedes gewünschte Verhalten programmiert werden können, die sich mit der zurückgegebene promise-Konstrukt.
Wenn Sie wirklich, wirklich wollen, zu führen, verspricht in den Konstruktor, ist es eine gute Idee zu übergeben, dann-fangen-Funktionen oder bieten einige callback-Konstrukt, so dass die Verbraucher können auf Versprechen, die Erfüllung oder Ablehnung. Im Konstruktor ist es auch eine gute übung zu warten nextTick/.dann, bevor die eigentliche Arbeit erledigen.
Jedes Versprechen muss eine endgültige fangen, oder es gibt ärger
InformationsquelleAutor der Antwort Harald Rudell
Einen anderen Weg, die Klassen, die nützlich sein können für die Vermittlung von asynchronen Aufgaben ist mit der ausschließlichen Verwendung von statische Methoden.
Natürlich, das ist nicht anders als das erstellen einer einfachen object-literal, oder eine neue Datei und darunter, außer Sie können mehr sauber
extend
.InformationsquelleAutor der Antwort Evan Carroll
Dies ist eine späte Antwort, aber der Grund, warum dein zweites Beispiel funktioniert nicht, weil der Kontext ein Fehler. Wenn Sie an einem
function () {}
als argument zuPromise.prototype.then()
die lexikalischethis
innerhalb der Funktion werden die Funktion selbst, und nicht die Klasse. Dies ist der Grund, warum die Einstellungthis.res
scheint, nichts zu tun:this
in diesem Fall bezieht sich auf die Funktion mit den eigenen Möglichkeiten.Gibt es mehrere Möglichkeiten, den Zugriff auf den äußeren scope in Javascript, die klassische ein (Sie finden Sie reichlich in ES5-code):
Indem Sie einen Verweis auf die Klasse
this
Sie können es in der inneren Bereiche.Den ES6 Weg, es zu tun, ist die Verwendung Pfeil-Funktionendie nicht einen neuen Bereich erstellen, sondern Sie "halten" das aktuelle.
Abgesehen von Rahmen betrifft, ist dies immer noch nicht eine optimale asynchrone Muster meiner Meinung nach, denn Sie haben keine Möglichkeit zu wissen, wenn
getHTML()
beendet hat, oder noch schlimmer, ist gescheitert. Dieses problem ist elegant gelöst mit async-Funktionen. Obwohl Sie keineasync constructor () { ... }
initiieren kann Versprechen, in den Konstruktor, undawait
es in den Funktionen, die davon abhängen.Beispiel gist einer async-Eigenschaft in einer Klasse-Konstruktor.
InformationsquelleAutor der Antwort Christophe Marois