ES6承诺错误处理

时间:2016-10-28 09:37:32

标签: javascript promise ecmascript-6 es6-promise

我的问题是错误是如何通过一系列延续传播到捕获延续的。

鉴于

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继续。

这个假设是否正确?

2 个答案:

答案 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进行优化,确实只是在它们已被拒绝时返回输入承诺。