/ / Warum werden konsequente verkettete Versprechen gelöst? - Javascript, node.js, Versprechen, Drossel

Warum werden konsequent verkettete Versprechen gelöst? - javascript, node.js, Versprechen, Bluebird

Ich versuche, mich um Promises / A + zu kümmern und bin in einigen Punkten verwirrt. Bedenken Sie:

function foo() {
console.log("In "foo" function: --> which returns a Promise");
return new Promise(function (resolve, reject) {
resolve()
});
}

var promise1 = foo();

var promise2 = promise1.then(function () {
console.log("Promise 1 has been resolved --> onFulfilled() returns a value");
return 1;
});

var promise3 = promise2.then(function () {
console.log("Promise 2 has been resolved --> onFulfilled() is not returning anything from inFulfilled()");
});

var promise4 = promise3.then(function () {
console.log("Promise 3 has been resolved");
});

/* Console:
In "foo" function: --> which returns a Promise
Promise 1 has been resolved --> onFulfilled() returns a value
Promise 2 has been resolved --> onFulfilled() is not returning anything from inFulfilled()
Promise 3 has been resolved
*/
  • Promise 1 muss explizit durch einen Anruf gelöst werden resolve()Andernfalls wird die Ausführung angehalten. Warum werden diese bei Versprechen 2 und 3 von der Ausführung als gelöst betrachtet (ohne dass dies erforderlich ist)? resolve()) und fährt mit dem nächsten fort .then in der Kette?
  • Die an promise2 gekettete Funktion "onFullfilled ()" gibt keinen Wert zurück. Ich kann keine klaren finden Referenz in der Spezifikation, was in diesem Fall passieren soll. Wird dieses Szenario so behandelt, als ob die Funktion zurückgegeben würde? nicht definiert? Ist dies auf die tatsächliche Implementierung der verwendeten Bibliothek zurückzuführen?

Antworten:

3 für die Antwort № 1

Promise-Handler (Erfolgs- oder Fehlerhandler) haben einen Rückgabewert. Jeder Anruf schafft ein neues Versprechen.

Wenn ein Wert zurückgegeben wird, lautet das Versprechenautomatisch aufgelöst. Wenn ein anderes Versprechen zurückgegeben wird, wartet das Versprechen, bis es entweder aufgelöst oder abgelehnt wurde, bevor es mit dem nächsten Anruf in der Versprechenskette fortgesetzt wird.

Ich denke, das erklärt das Verhalten, das Sie sehen.


0 für die Antwort № 2

Das Verhalten, das Sie suchen, ist hier bei # 7 (https://github.com/promises-aplus/promises-spec#the-then-method) im Versprechen / A + spec.

promise2 = promise1.then(onFulfilled, onRejected);

"Wenn entweder onFulfilled oder onRejected einen Wert x zurückgibt, führen Sie die Promise Resolution Procedure [[Resolve]] (promise2, x) aus."

Ich nehme davon weg, dass, wenn das erste Versprechen nicht erfüllt ist, jedes Versprechen, das daraus erstellt wurde (einschließlich des neuen Versprechens) promise2), ist fehlgeschlagen / behoben.

z.B: Wenn Sie sich entschließen promise1 In Ihrem Beispiel lösen sich auch alle nachfolgenden Versprechungen auf.