Ich benutze Bluebird erst seit ein paar Tagen, aber ich möchte all meinen alten Code durchgehen und promisify
it :)
Mein Problem ist, dass ich den Fluss von then()
-Befehlen immer noch nicht vollständig verstehe.
Betrachten Sie diese beiden Blöcke:
EIN
methodThatReturnsAPromise().then(task2).then(task3);
B
var promise = methodThatReturnsAPromise();
promise.then(task2)
promise.then(task3);
in Szenario A task3
erhält das Ergebnis von task2
? In B bekommen sie alle das Ergebnis des ersten Versprechens?
Wie unterscheidet sich die zweite von der Ausführung von Promise.all
von Bluebird?
Wie machen diese A/B/Promise.all
unterscheiden sich in Bezug auf die Verwendung der catch
-Methode (wo soll ich das hinstellen).
Entschuldigung, es sind ein paar Fragen in einer.
Willkommen in der wundervollen Welt der Versprechen.
then
in Ihrem Beispiel funktioniertIhre Aussage in 1
Ist richtig. Wir können ein in Bluebird gelöstes Versprechen simulieren, indem wir Promise.resolve
Für einen Wert verwenden.
Lassen Sie uns dies zeigen:
Lassen Sie uns eine Funktion erhalten, die ein Versprechen zurückgibt:
function foo(){
return Promise.resolve("Value");
}
foo().then(alert);
Dieses kurze Snippet warnt "Value"
, Wenn angezeigt wird.
Lassen Sie uns nun zwei weitere Versprechen erstellen, die jeweils unterschiedliche Werte anzeigen und zurückgeben.
function task2(e){
alert("In two got " + e);
return " Two ";
}
function task3(e){
alert("In three got " + e);
return " Three ";
}
Wie Sie in Ihrem ersten Code sehen können, wird er in der Tat in einer Kette aufgelöst, die jeweils den Wert des vorherigen Teils enthält.
Im zweiten Beispiel erhalten Task2 und Task3 denselben Wert und werden auch zusammen ausgeführt (dh Task 3 wartet nicht auf Task 2). Sie können das hier sehen .
Promise.all (oder das Zurückgeben eines Arrays von einem then
Fulfillment-Handler und anschließende Verwendung von .spread
) Wird verwendet, um darauf zu warten, dass mehrere Ergebnisse vollständig sind. In Ihrem Beispiel hängen Sie an einem einzelnen Ergebnis in mehreren Teilen.
Sie setzen catch immer dort, wo der Fehler abgefangen werden soll. Wie du es normalerweise im synchronen Code tun würdest. Denken Sie daran, immer ein Versprechen oder einen versprochenen Code einzuwerfen.
im Szenario Eine Aufgabe3 wird das Ergebnis von Aufgabe2 erhalten? In B bekommen sie alle das Ergebnis des ersten Versprechens?
Ja.
Wie unterscheidet sich der zweite von Promise.all von Bluebird?
Sie holen die Ergebnisse der (parallelen) Aufgaben 2 und 3 nicht in ein neues Versprechen.
Wie unterscheiden sich diese A/B/Promise.all, wenn es um die catch-Methode geht (wo lege ich sie hin)?.
Normalerweise würden Sie es an das Ende der Kette setzen, es sei denn, Sie möchten einen bestimmten Fehler abfangen.
promise.catch()
// handles rejections of this promise
promise.then(task2).catch()
// handles rejections from either promise or task2
// if promise is rejected, task2 will not be executed
Promise.all(promise.then(task2), promise.then(task3)).catch()
// handles rejections from any.
// if promise is rejected, neither task2 nor task3 will be executed
// if task2 or task3 throw, the error will immediately handled
// and the other task will not be affected (but its result is unavailable)
Sie erhalten nicht ein einfaches Prinzip Verkettung
Im ersten kann man gerne schreiben
var promise = methodThatReturnsAPromise(), promise1 = promise.then(task2); promise1.then(task3);
Im zweiten Fall
var promise = methodThatReturnsAPromise(); promise.then(task2) promise.then(task3);
Hoffe, das erklärt den Unterschied zwischen den beiden