【发布时间】:2017-04-26 09:57:52
【问题描述】:
我正在尝试链接承诺,这样如果一个承诺被拒绝,链就会中断。我遵循previous SO question 的线索并尝试将其应用于原生承诺,但我认为我误解了事情的运作方式。
这是我重写代码的方式:
Promise.resolve()
.then(function() {
return step(1)
.then(null, function() {
stepError(1);
});
})
.then(function() {
return step(2)
.then(null, function() {
stepError(2);
});
})
.then(function() {
return step(3)
.then(null, function() {
stepError(3);
});
});
function step(n) {
console.log('Step '+n);
return (n === 2) ? Promise.reject(n) : Promise.resolve(n);
}
function stepError(n) {
console.log('Error '+n);
return Promise.reject(n);
}
以上代码的输出为:
Step 1
Step 2
Error 2
Step 3
[UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): 2]
在我的理解中,第 2 步应该打破链条,第 3 步不应该执行。当 step(2) 返回一个被拒绝的 promise 时, stepError(2) 会按预期执行。但是由于它返回 Promise.reject(2),因此不应执行下一个 then 中的函数,并且由于最后没有 catch,因此步骤 2 的拒绝承诺似乎 - 正如预期的那样 - 被转发直到它退出链,因为它没有找到任何处理程序。
我在这里错过了什么?
这是一个可以玩的 JSFiddle:https://jsfiddle.net/6p4t9xyk/
【问题讨论】:
标签: javascript promise