Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺控制流-捕获与拒绝_Javascript_Node.js_Promise_Es6 Promise - Fatal编程技术网

Javascript 承诺控制流-捕获与拒绝

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

我目前想知道为什么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(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…)
的行为完全相同。如果你想分支,你应该。