我的问题是错误是如何通过一系列延续传播到捕获延续的。
鉴于
Promise.reject(new Error("some error"))
.then(v => v + 5)
.then(v => v + 15)
.catch(error => console.log(error));
在第1行之后,我们有一个被拒绝的承诺。当调用continuation时,.then(v => v + 5),原始被拒绝的promise将按原样返回。这同样适用于第3行。所以没有继续运行,一旦达到了catch继续,我们仍然有相同的原始对象,结果是错误,然后传递给catch继续。
这个假设是否正确?
答案 0 :(得分:3)
是的,从spec:
可以看出 2.2.7。 then
必须回复承诺。
promise2 = promise1.then(onFulfilled, onRejected);
2.2.7.4。如果onRejected
不是[[或未指定]]并且promise1
被拒绝,则必须拒绝promise2
,理由与promise1
相同。
换句话说,中间的then
""跳过",或者承诺"落在"他们(虽然可以这样想);相反,他们返回的承诺被拒绝的原因与输入承诺相同。
顺便说一句,将这些"拒绝"而不是"错误"更准确。 (虽然,"理由"拒绝通常是一个错误)。称这些"处理程序"而不是"继续"也是更常见的。
答案 1 :(得分:2)
是按原样
返回的原始拒绝承诺
不,当调用then
方法时,它还不知道 1 的结果,因此它会创建一个新的promise并返回它。然而,只要最初的承诺拒绝,新的承诺就会立即被拒绝。第3行的承诺也是如此,然后使用catch
回调的结果解决第4行中的最终承诺。
1:至少在你要问的ES6承诺中。其他承诺实现(例如Creed进行优化,确实只是在它们已被拒绝时返回输入承诺。