Verkettung asynchrone Methodenaufrufe - javascript
Haben Sie ein Prototyp-Objekt Foo mit zwei asynchrone Methodenaufrufe, bar und baz.
var bob = new Foo()
Foo.prototype.bar = function land(callback) {
setTimeout(function() {
callback()
console.log('bar');
}, 3000);
};
Foo.prototype.baz = function land(callback) {
setTimeout(function() {
callback()
console.log('baz');
}, 3000);
};
Wollen wir tun, bob.bar().baz() und log - "bar" und "baz" nacheinander.
Wenn Sie nicht ändern Sie die Methode Aufrufe (einschließlich der übergabe in der callback-Funktion), wie kann Sie an einem Standard-callback in diese Methode Aufrufe?
Einige Ideen:
-
Wrap "bob" mit Dekorator (noch unscharf, wie das umzusetzen, könnte ein kleines Beispiel)
-
Ändern Konstruktor zum zuweisen von Standard-callback, wenn keine zugewiesen (haben Sie nicht berücksichtigt, wenn dies möglich ist oder nicht)
-
Einen generator wrapper, der wird weiterhin zu nennen, weiter Verfahren, bis keine mehr übrig sind?
- Sie können angeben, wie Sie verwenden würden, was Sie verspricht? Sie traten aber nicht sicher, wie Sie Sie anwenden
- Sind Sie verheiratet
bob.bar().baz()
syntax? Es gibt viele Möglichkeiten, um den Betrieb Ihrer Beschreibung, aber ich kann nicht an nichts denken, das würde die Arbeit mit diesem speziellen syntax. - Übernehmen wir 🙁 ich glaube, wir haben es zum Verpacken irgendwie
- Verwenden Sie Warteschlangen, wenn Sie die async-code nicht scheitern kann. Verwenden Sie verspricht, wenn man es kann.
- Haben Sie einen Blick auf stackoverflow.com/q/36242757/1048572. Und Nein, Generatoren absolut nicht helfen Sie hier
- Bitte haben Sie einen Blick auf dieses Thema: stackoverflow.com/a/39029819
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mehr empfohlen, stattdessen ist die Verwendung verspricht. Da dies eine community-weiten trend zu tun async stopft.
Warum würden Sie wollen, zu tun, nur um dies zu erreichen
bob.bar().baz()
"syntax"? Wenn Sie könnten, tun es ziemlich einfach mit dem Versprechen API ohne zusätzliche Anstrengungen zu machen, die syntax arbeiten, die in der Tat erhöht die Komplexität des Codes machen, der eigentliche code nur schwer zu verstehen.So, möchten Sie vielleicht zu prüfen, mit den promise-basierten Ansatz etwas wie dieses, die nicht bieten viel mehr Flexibilität als das, was Sie würde erreicht haben, die von Ihrem Ansatz:
Nun Sie würde dies tun, um Sie auszuführen nacheinander einer nach dem anderen:
Wenn Sie brauchen, um Kette mehr Funktionen, die Sie konnte, es einfach zu tun:
Sowieso, wenn Sie nicht mit Versprechungen, die Sie möchten möglicherweise Lesen Sie diese
Warnung das ist noch nicht so ganz richtig. Idealerweise würden wir eine Unterklasse Versprechen und haben richtige dann/catch-Funktionalität, aber es gibt einige Einschränkungen mit Unterklassen bluebird Versprechen. Die Idee ist, speichern Sie ein internes array von Versprechen, erzeugende Funktionen, dann, wenn ein Versprechen auf die gewartet (dann/await) Seriell warten auf diese Versprechen.
Ergebnis:
Wenn Sie vermeiden möchten, callback-Hölle und halten Sie Ihre geistige Gesundheit ES6 promises sind der geeignetste Ansatz, zum Wohle der funktionalen Programmierung. Sie nur Kette bis Ihre sequentielle asynchrone Aufgaben in der asynchronen timeline ebenso wie arbeiten in einem synchronen Zeitachse.
In diesem speziellen Fall, die Sie gerade brauchen, um promisify asynchronen Funktionen. Davon ausgehen, dass Ihre asynch Funktionen nimmt eine Daten-und eine callback-wie
asynch(data,myCallback)
. Lassen Sie uns davon ausgehen Sie, dass der Rückruf Fehler ersten Typs.Wie;
Wenn Ihr asynch-Funktion ist promisified, werden Sie tatsächlich zurückgegeben werden, eine Funktion, die Ihre Daten und gibt ein Versprechen. Sie erwartet
myCallback
amthen
Bühne. Der Rückgabewert vonmyCallback
wird dann an die nächste Phase, wo können Sie ein anderes aufrufen asynch-Funktion geliefert, mit der return-Wert vonmyCallback
- und dies geht weiter und weiter, so lange, wie Sie benötigen. Also lasst uns sehen, wie wir diese umsetzen Abstrakt, um Ihren workflow.JS: