ES6 Promise 错误处理
ES6 Promise Error Handling
我的问题是错误是如何通过一系列 then 延续传播到 catch 延续的。
给出
Promise.reject(new Error("some error"))
.then(v => v + 5)
.then(v => v + 15)
.catch(error => console.log(error));
在第 1 行之后,我们有一个被拒绝的承诺。当继续被调用时,.then(v => v + 5),是原样返回的原始被拒绝的承诺。这同样适用于第 3 行。因此没有 then continuations 运行 并且一旦到达 catch continuation 我们仍然有相同的原始对象,错误作为结果然后传递给 catch continuation.
这个假设是否正确?
是的,从spec可以清楚地看出:
2.2.7。 then
必须 return 一个承诺。
promise2 = promise1.then(onFulfilled, onRejected);
2.2.7.4。如果 onRejected
不是函数 [[或未指定]] 并且 promise1
被拒绝,则 promise2
必须被拒绝,原因与 promise1
.
相同
换句话说,不完全是中间 then
是 "skipped",或者承诺 "falls through" 他们(尽管可以这样想方法);相反,他们 return 的承诺被拒绝,原因与输入承诺相同。
顺便说一下,将这些称为 "rejections" 比 "errors" 更准确(尽管拒绝的 "reason" 通常是错误的)。而且将这些称为 "handlers" 而不是 "continuations".
也更常见
is the original rejected promise returned as is
不,当 then
方法被调用时它还不知道结果1,所以它创建了一个新的承诺和 returns那。然而,一旦原始承诺被拒绝,新的承诺就会立即以同样的理由被拒绝。第 3 行的承诺也是如此,然后第 4 行的最终承诺由 catch
回调的结果解决。
1:至少在你问的 ES6 承诺中。 Creed 等其他 promise 实现进行了优化,并且在输入 promise 已经被拒绝时确实简单地 return。
我的问题是错误是如何通过一系列 then 延续传播到 catch 延续的。
给出
Promise.reject(new Error("some error"))
.then(v => v + 5)
.then(v => v + 15)
.catch(error => console.log(error));
在第 1 行之后,我们有一个被拒绝的承诺。当继续被调用时,.then(v => v + 5),是原样返回的原始被拒绝的承诺。这同样适用于第 3 行。因此没有 then continuations 运行 并且一旦到达 catch continuation 我们仍然有相同的原始对象,错误作为结果然后传递给 catch continuation.
这个假设是否正确?
是的,从spec可以清楚地看出:
2.2.7。 then
必须 return 一个承诺。
promise2 = promise1.then(onFulfilled, onRejected);
2.2.7.4。如果 onRejected
不是函数 [[或未指定]] 并且 promise1
被拒绝,则 promise2
必须被拒绝,原因与 promise1
.
换句话说,不完全是中间 then
是 "skipped",或者承诺 "falls through" 他们(尽管可以这样想方法);相反,他们 return 的承诺被拒绝,原因与输入承诺相同。
顺便说一下,将这些称为 "rejections" 比 "errors" 更准确(尽管拒绝的 "reason" 通常是错误的)。而且将这些称为 "handlers" 而不是 "continuations".
也更常见is the original rejected promise returned as is
不,当 then
方法被调用时它还不知道结果1,所以它创建了一个新的承诺和 returns那。然而,一旦原始承诺被拒绝,新的承诺就会立即以同样的理由被拒绝。第 3 行的承诺也是如此,然后第 4 行的最终承诺由 catch
回调的结果解决。
1:至少在你问的 ES6 承诺中。 Creed 等其他 promise 实现进行了优化,并且在输入 promise 已经被拒绝时确实简单地 return。