Was ist der richtige Weg, um die Kette asynchrone Aufrufe in javascript?
Ich bin versuchen zu finden der beste Weg zum erstellen asynchroner Aufrufe bei jedem Aufruf richtet sich an die Vorherige Aufruf beendet haben. Im moment bin ich die Verkettung der Methoden durch den rekursiven Aufruf einen definierten Prozess, der Funktion, wie unten dargestellt.
Dies ist, was ich bin derzeit dabei.
var syncProduct = (function() {
var done, log;
var IN_CAT = 1, IN_TITLES = 2, IN_BINS = 3;
var state = IN_CAT;
var processNext = function(data) {
switch(state) {
case IN_CAT:
SVC.sendJsonRequest(url("/api/lineplan/categories"), processNext);
state = IN_TITLES;
break;
case IN_TITLES:
log((data ? data.length : "No") + " categories retrieved!");
SVC.sendJsonRequest(url("/api/lineplan/titles"), processNext);
state = IN_BINS;
break;
case IN_BINS:
log((data ? data.length : "No") + " titles retrieved!");
SVC.sendJsonRequest(url("/api/lineplan/bins"), processNext);
state = IN_MAJOR;
break;
default:
log((data ? data.length : "No") + " bins retrieved!");
done();
break;
}
}
return {
start: function(doneCB, logCB) {
done = doneCB; log = logCB; state = IN_CAT;
processNext();
}
}
})();
Ich würde dann rufen Sie diese wie folgt
var log = function(message) {
//Impl removed.
}
syncProduct.start(function() {
log("Product Sync Complete!");
}, log);
Während dies funktioniert völlig in Ordnung für mich, ich kann nicht helfen, aber denke, es muss einen besseren (einfacheren) Weg. Was passiert später, wenn mein rekursive Aufrufe zu tief?
HINWEIS: ich bin nicht mit javascript in dem browser, sondern direkt in das Titanium-framework, das ist vergleichbar mit Javascript für Node.js.
InformationsquelleAutor der Frage Brett Ryan | 2012-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es viele Bibliotheken und tools, die asynchrone Ketten-und control-flow für Sie und Sie kommen meistens in zwei Geschmacksrichtungen:
Control-flow-Bibliotheken
Siehe beispielsweise asyncseq und Schritt (callback-basiert) oder Q und futures (Versprechen). Der wesentliche Vorteil dieser ist, dass Sie nur die Ebenen JS-Bibliotheken, die die Schmerzen lindern von der asynchronen Programmierung.
In meiner persönlichen Erfahrung, zu Versprechen-basierten Bibliotheken führen tendenziell zu code, der sieht mehr wie gewohnt synchronous code, da Sie die return-Werte mit "return" und da Versprechen Werte übergeben werden können und gespeichert, um, ähnlich wie echte Werte.
Auf der anderen Seite, Fortsetzung-basierten code wird low-level, da es manipuliert-code-Pfade explizit. Dies kann möglicherweise erlauben, für flexiblere Ablaufsteuerung und eine bessere integration mit bestehenden Bibliotheken, aber es könnte auch dazu führen, dass mehr boilerplaty und weniger intuitiv-code.
Javascript CPS-Compiler
Erweiterung der Sprache zum hinzufügen von native support für Coroutinen/Generatoren dient zum schreiben von asynchronem code in einer sehr einfachen Art und Weise und spielt schön mit dem rest der Sprache, das heißt, Sie können Javascript verwenden von if-Anweisungen, Schleifen etc, anstatt dass zu replizieren, die Sie mit Funktionen. Dies bedeutet auch, dass es sehr einfach zu konvertieren, die zuvor sync-code in einer asynchronen version. Es gibt jedoch den offensichtlichen Nachteil, dass nicht jeder browser wird ausgeführt Javascript-Erweiterung, so müssen Sie eine Zusammenstellung Schritt in Ihren build-Prozess zu konvertieren Sie Ihre code, um regelmäßig mit JS-callbacks in continuation-passing-style. Jedenfalls eine vielversprechende alternative ist der Generatoren, die in der Ecmascript-6-Spezifikation - während nur firefox unterstützt Sie nativ als jetzt gibt es Projekte wie regenerator und Traceur zu kompilieren, Sie wieder zu Rückrufen. Es gibt auch andere Projekte, erstellen Ihre eigenen async syntax (seit es6-Generatoren nicht gekommen, hatte sich damals). In dieser Kategorie finden Sie Dinge, wie tamejs und Iced Coffeescript. Schließlich, wenn Sie Node.js dort konnte man auch einen Blick auf Fasern.
Meine Empfehlung:
Wenn Sie wollen einfach nur etwas einfach, nicht erschweren Ihre build-proccess, ich würde empfehlen, gehen mit dem, was control-flow-Bibliothek, die am besten passt Ihre persönlichen Stil und die Bibliotheken, die Sie bereits verwenden.
Allerdings, wenn Sie erwarten, zu schreiben, viele komplizierte und tief integrierte asynchrone code würde ich dringend empfehlen, zumindest einen Blick in eine compiler-basierte alternative.
InformationsquelleAutor der Antwort hugomg