Javascript 承诺控制流-捕获与拒绝
我目前想知道为什么ES6本机Promise设置中的抛出没有到达catch块Javascript 承诺控制流-捕获与拒绝,javascript,node.js,promise,es6-promise,Javascript,Node.js,Promise,Es6 Promise,我目前想知道为什么ES6本机Promise设置中的抛出没有到达catch块 new Promise(function(resolve,reject){ reject('bar') }).then(function resolved(){ console.log('resolved 1'); }, function rejected(){ console.log('rejected 1') throw new Error(); }).then(funct
new Promise(function(resolve,reject){
reject('bar')
}).then(function resolved(){
console.log('resolved 1');
}, function rejected(){
console.log('rejected 1')
throw new Error();
}).then(function resolved(val){
console.log('resolved 2');
}, function rejected(){
console.log('rejected 2');
}).catch(function(err){
console.log('catch');
});
我正在寻找一种将控件流获取到catch块的方法,但是如果我使用一个被拒绝的处理程序,如果我抛出一个错误,那么控件将在那里结束,而不是在catch中
简单地说,我正在寻找一种方法来结束catch块,即使有一个onRejected处理程序……有什么方法可以做到这一点吗
new Promise(function(resolve,reject){
throw new Error(); // this goes to onRejected
reject('bar'); // this goes to onRejected
}).then(function onResolved(){
console.log('resolved');
}, function onRejected(){
console.log('rejected')
}).catch(function(err){
console.log('catch');
});
我的目标是根据是否抛出错误和是否调用拒绝分别进行分支。不确定这是否可能。也许有一种方法可以显式地调用catch?如果可能的话,我想找到一种不在最终的onRejected处理程序中显式抛出新错误的方法
以下是我的目标,并附上评论:
new Promise(function(resolve,reject){
if(success){
resolve('success'); //this goes to next onResolved
}
else if(fail){
reject('fail'); //this goes to next onRejected (or catch if there is no onRejected)
}
else {
throw new Error('Fatal'); //this goes to next catch
}
});
这就是我正在寻找的行为错误未到达
的原因。catch()
是由于在onRejected
中处理错误造成的
将onRejected
中处理的错误传递给chained.catch()
在onRejected
中再次抛出错误
新承诺(功能(解析、拒绝){
抛出新错误();//这将转到onRejected
拒绝('bar');//这转到onRejected
}).然后(函数onResolved(){
console.log('resolved');
},函数onRejected(错误){
console.log('已拒绝')
失误
}).catch(函数(err){
log(err'catch');
});代码>是的,谢谢,但实际上,我想避免这种情况,因为这是针对库的,我不想要求用户加入onRejected,我想让一些流直接进入catch…这有意义吗?“我想让一些流直接进入catch”不确定是否正确解释?也许我可以在“已解决”而不是“已拒绝”时加入…这将是一个棘手的问题,我想分支代码-->如果流在捕获中结束,这意味着一件事(更致命的错误),那么如果流在“已拒绝”(不太致命的错误)…这是我当前的目标,可以在onResolved
中使用throw
。但是,如果在.catch()
之前的onRejected中处理错误,则错误不会到达后续的.catch()
当您使用拒绝处理程序“处理”拒绝时,拒绝被视为“已处理”现在,承诺状态变为已实现,除非您从拒绝处理程序返回被拒绝的承诺或从拒绝处理程序抛出。这就是承诺拒绝处理程序的设计方式。你不能改变这一点。如果希望拒绝不被处理并继续传播,则抛出或返回被拒绝的承诺。根本没有办法绕过这个基本的设计决策。你无法区分“下一个捕获”和“下一个被拒绝”
。捕获(…)
只是的糖分。然后(null…)
的行为完全相同。如果你想分支,你应该。