Javascript承诺:捕获流
在下面的代码中,我希望能够在foo失败时退出应用程序,而不是在goo失败时退出。我的问题是,当顾拒绝的时候,它就陷入了富的陷阱。对于这个问题是否有一个承诺的最佳实践解决方案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()。然后(()=>{
返回粘性捕获(()=>{
//做点什么
//拒绝但不退出应用程序
})
})
.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我也不确定,因为这个解决方案很简单而且有效:)不确定为什么它不能获得更多的投票权——这是一个非常复杂的问题