为什么随之而来的链式承诺解决了?

我正试图让我的头在Promises / A +的位置,而且我对两个点感到困惑。 考虑一下:

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必须通过调用resolve()来显式parsing,否则执行暂停。 为什么在承诺2和承诺3中,执行考虑了这些解决scheme(不需要resolve() ),然后进入下一个链。
  • 链接到promise2的'onFullfilled()'函数不返回值。 在这种情况下,我无法在规范中find任何明确的参考 。 这种情况是否被视为函数返回undefined ? 这是下到实际使用的图书馆的实施?

Promise处理程序(成功或error handling程序)具有返回值。 然后每一个电话都创造一个新的承诺

如果返回一个值,那么承诺是自动解决的。 如果另一个承诺被退回,那么承诺将等待,直到它被解决或被拒绝,然后再继续下一个承诺链中的调用。

我认为这解释了你所看到的行为。

您正在查找的行为位于promise / A +规范中的#7( https://github.com/promises-aplus/promises-spec#the-then-method )。

promise2 = promise1.then(onFulfilled, onRejected);

“如果onFulfilled或onRejected返回值x,则运行Promise Resolution Procedure [[Resolve]](promise2,x)。”

我从中得出的结论是,当第一个承诺失败/解决时,由它产生的任何承诺(包括新的承诺承诺promise2 )都将失败/解决。

例如:当你在你的例子中parsingpromise1时,所有后续的promise都会被parsing。