Javascript承诺:捕获流

Javascript承诺:捕获流,javascript,ecmascript-6,promise,es6-promise,Javascript,Ecmascript 6,Promise,Es6 Promise,在下面的代码中,我希望能够在foo失败时退出应用程序,而不是在goo失败时退出。我的问题是,当顾拒绝的时候,它就陷入了富的陷阱。对于这个问题是否有一个承诺的最佳实践解决方案 foo()。然后(()=>{ 返回粘性捕获(()=>{ //做点什么 //拒绝但不退出应用程序 }) }) .catch(()=>{ //退出应用程序 //拒绝 }) 不要在foo.catch中拒绝-您不希望拒绝传播到foo.catch处理程序 foo().then(() => { return goo.cat

在下面的代码中,我希望能够在foo失败时退出应用程序,而不是在goo失败时退出。我的问题是,当顾拒绝的时候,它就陷入了富的陷阱。对于这个问题是否有一个承诺的最佳实践解决方案

foo()。然后(()=>{
返回粘性捕获(()=>{
//做点什么
//拒绝但不退出应用程序
})
})
.catch(()=>{
//退出应用程序
//拒绝
})

不要在
foo.catch
中拒绝-您不希望拒绝传播到
foo.catch
处理程序

foo().then(() => {
    return goo.catch(() => {
        // do something but don't reject
    })
})
.catch(() => {
    // exit app
    // reject
})

所以,您进入catch块并从错误情况中“恢复”。通过抛出/拒绝,您可以进一步传递异常,在出现
goo
的情况下,您不希望这样。

不要在
goo.catch
中拒绝-您不希望拒绝传播到
foo.catch
处理程序

foo().then(() => {
    return goo.catch(() => {
        // do something but don't reject
    })
})
.catch(() => {
    // exit app
    // reject
})

所以,您进入catch块并从错误情况中“恢复”。通过抛出/拒绝您进一步传递异常,在出现
goo
的情况下,您不需要此异常。

只需
goo.catch()
块返回
(或调用
Promise.resolve()


只需从
goo.catch()返回
(或调用
Promise.resolve()


我认为这样做很有效:

foo()
.catch(()=>{
//退出应用程序
//拒绝
})
.然后(()=>{
返回粘性捕获(()=>{
//做点什么
//拒绝
})
})

我认为这样做很有效:

foo()
.catch(()=>{
//退出应用程序
//拒绝
})
.然后(()=>{
返回粘性捕获(()=>{
//做点什么
//拒绝
})
})

让我们看看您希望在同步代码中实现什么:

function main() {
    try {
        foo();
    } catch(e) {
        console.log("Exit process");
        throw e;
    }
    try {
        goo();
    } catch(e) {
        console.log("do something");
        throw e;
    }
}
可以通过嵌套捕捉来实现这一点:

函数foo(){
返回承诺。拒绝();
}
函数goo(){
返回承诺。拒绝();
}
函数main(){
return foo().catch(e=>{
console.log(“退出过程”);
//如果进程已经退出,那么拒绝有什么意义?
投掷e;
}).然后(()=>{
return goo().catch(e=>{
log(“做某事”);
投掷e;
});
});
}

main().catch(()=>{console.log(“main被拒绝”);})让我们看看您希望在同步代码中实现什么:

function main() {
    try {
        foo();
    } catch(e) {
        console.log("Exit process");
        throw e;
    }
    try {
        goo();
    } catch(e) {
        console.log("do something");
        throw e;
    }
}
可以通过嵌套捕捉来实现这一点:

函数foo(){
返回承诺。拒绝();
}
函数goo(){
返回承诺。拒绝();
}
函数main(){
return foo().catch(e=>{
console.log(“退出过程”);
//如果进程已经退出,那么拒绝有什么意义?
投掷e;
}).然后(()=>{
return goo().catch(e=>{
log(“做某事”);
投掷e;
});
});
}


main().catch(()=>{console.log(“main被拒绝”);})执行某些操作
代码抛出任何未捕获的内容,那么最后的
.catch
当然仍会被触发exception@dfsq那不行,因为我不想接受goo的失败。我需要失败来传播给我“我不想吞下goo的失败,我需要失败来传播”与“我的问题是当goo拒绝时,它会陷入foo的陷阱”相矛盾。同时检查Nir Smadar的答案。如果
做某事
代码抛出任何未捕获的内容,那么最终的
捕获
当然仍会被触发exception@dfsq那不行,因为我不想接受goo的失败。我需要失败来传播给我“我不想吞下goo的失败,我需要失败来传播”与“我的问题是当goo拒绝时,它会陷入foo的陷阱”相矛盾。还要检查一下尼尔斯玛达的答案。那不行,因为我不想吞下古的失败。我需要传播失败,因此您希望在承诺链完成后出现
goo
错误
?请参阅我编辑的答案。
goo
的错误将向下传播(到承诺链之外)。这不行,因为我不想吞下goo的失败。我需要传播失败,因此您希望在承诺链完成后出现
goo
错误
?请参阅我编辑的答案。
goo
的错误将向下传播(到承诺链之外)。退出应用程序后拒绝有什么意义?应用程序已经退出了。只是澄清一下。“Foo’s catch”并不是真正的Foo’s catch。因为
catch
返回它被调用的承诺,并且因为您在
然后
回调中返回
catch
的结果,最外层的
catch
调用的上下文实际上是
goo
@danielant,如果Foo抛出/拒绝呢?我相信您必须调用Foo.catch(…)在foo之前。然后(…)如果你想在foo中发现拒绝。请注意以下文章“链接”部分的第二段:@Danielaran正是如此——因此答案被接受:)退出应用程序后拒绝有什么意义?应用程序已经退出了。只是澄清一下。“Foo’s catch”并不是真正的Foo’s catch。因为
catch
返回它被调用的承诺,并且因为您在
然后
回调中返回
catch
的结果,最外层的
catch
调用的上下文实际上是
goo
@danielant,如果Foo抛出/拒绝呢?我相信您必须调用Foo.catch(…)在foo之前。然后(…)如果你想在foo中发现拒绝。请注意以下文章“链接”部分的第二段:@Danielaran正是如此——因此得到了公认的答案:)不确定为什么这不能获得更多的选票——这是一种非常明确的方法,不需要在讨论承诺时这么多人所说的晦涩的“解释”。简单的反应顺序是有意义的,不是吗?谢谢你,@nir-smadar@narration_sd我也不确定,因为这个解决方案很简单而且有效:)不确定为什么它不能获得更多的投票权——这是一个非常复杂的问题