“捕获”如何在原生承诺链中工作
How does the 'catch' work in a native Promise chain?
在Chrome或Firefox的控制台标签上尝试这段代码
var p = new Promise(function(resolve, reject) {
setTimeout(function() {
reject(10);
}, 1000)
})
p.then(function(res) { console.log(1, 'succ', res) })
.catch(function(res) { console.log(1, 'err', res) })
.then(function(res) { console.log(2, 'succ', res) })
.catch(function(res) { console.log(2, 'err', res) })
结果将是
1 "err" 10
2 "res" undefined
我尝试过许多其他例子,但似乎第一个then()
返回了一个始终解决且永不拒绝的承诺。我已经在Chrome 46.0.2490.86和Firefox 42.0上尝试过这个。为什么会这样?我以为then()
和catch()
可以多次连锁?
就像在同步代码中一样:
try {
throw new Error();
} catch(e) {
console.log("Caught");
}
console.log("This still runs");
处理异常后运行的代码将运行 - 这是因为异常是一种错误恢复机制。通过添加该捕获,您表示错误已处理。在同步情况下,我们通过重新抛出来处理这个问题:
try {
throw new Error();
} catch(e) {
console.log("Caught");
throw e;
}
console.log("This will not run, still in error");
承诺的作用类似:
Promise.reject(Error()).catch(e => {
console.log("This runs");
throw e;
}).catch(e => {
console.log("This runs too");
throw e;
});
作为提示 - 永远不要拒绝非Error
,因为您会丢失很多有用的东西,例如有意义的堆栈跟踪。
为什么会这样?我以为 then(( 和 catch(( 可以多次链接?
@Benjamin是对的,+1,但换句话说,这些是规则:
- 如果多次添加
then
,则会链接应按顺序调用的方法,直到引发异常。then
链中的异常必须由then
后声明的catch
处理。如果then
后没有catch
,将触发此错误:Uncaught (in promise) Error(…)
。 - 如果多次添加
catch
,则会链接出现问题时应调用的方法(在前面的then
函数中(。但是,仅当第一个catch
重新引发异常时,才会调用链中的第二个,依此类推。 - 当触发
catch
时,链将在catch
之后声明的下一个then
恢复。
相关文章:
- 承诺工作不正常
- 将异步工作流更改为承诺(蓝鸟)
- 承诺内部工作
- 在节点中,使用Q,使两个函数并行工作,但只等待第一个函数实现其承诺
- 承诺链不;没有按预期工作
- 无法获得蓝鸟承诺和猫鼬的 save() 在 node.js 中工作
- 回调/承诺无法正常工作
- 嵌套的 AJAX 调用列表和 $.when.apply - 延迟承诺无法正常工作
- 无法获得$q.所有工作都致力于多个承诺
- ngInit 不异步工作($q承诺)
- 为什么我的承诺不能在角度js中工作
- 我的承诺是否按预期工作
- jQuery推迟并承诺不能正常工作
- Node.js承诺q不能按预期工作
- “捕获”如何在原生承诺链中工作
- Nodejs承诺不会正常工作
- BluebirdJS承诺与jQuery不能正常工作
- 递延和承诺函数不能正常工作
- 如何让这个javascript承诺工作
- 如何让量角器延迟承诺工作