webentwicklung-frage-antwort-db.com.de

Bluebird, verspricht und dann ()

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);
  1. in Szenario A task3 erhält das Ergebnis von task2? In B bekommen sie alle das Ergebnis des ersten Versprechens?

  2. Wie unterscheidet sich die zweite von der Ausführung von Promise.all von Bluebird?

  3. 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.

40
Madd0g

Willkommen in der wundervollen Welt der Versprechen.

Wie then in Ihrem Beispiel funktioniert

Ihre 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

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.

Der Fang

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.

48

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)
12
Bergi

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

3
aWebDeveloper