我已获得以下代码:
router.post('/', function(req, res, next) {
doAsyncStuff()
.then(ret=>{
console.log('first then block')
if (/*something*/)
res.sendStatus(202); /*I want to stop the execution here. changing this in return res.sendstatus will not solve the problem*/
else
return doanotherAsyncStuff() /*i could move the second then block here but i need another catch statment*/
})
.then(ret=>{
console.log('second then block');
res.sendStatus(200)
})
.catch(err=>{
console.log(err)
err.status = 503
next(err)
})
});
我的问题是当我的if
表达式为真时,我想调用res.sendstatus(202)
并停止执行流程。但是我的代码没有做我想要的,因为即使我的if
表达式为真,"第二,然后阻止"仍然记录。
我可以在调用then
方法之后将第二个doanotherAsyncStuff()
块移动到第一个块中,但如果我这样做,我需要另一个catch语句,我想要只有一个catch语句在任何名为。
所以我的问题是:当我的if
表达式为真时,有没有办法阻止承诺流执行?
答案 0 :(得分:0)
将这些块分开。在if返回你想要的东西,在else中调用另一个函数,在那里你执行异步的东西,你在那里链接另一个然后阻塞,而不是在第一个之后紧接着。
然后首先添加一个catch,以便在第一个promise中捕获错误。
答案 1 :(得分:0)
不,你不能选择在你的一个回调执行中击中哪个后续then
。
做你的建议:
...
.then(ret => {
if (/*something*/) {
return res.sendStatus(202);
}
return doanotherAsyncStuff().then(function() {
return res.sendStatus(200);
});
})
.catch(err=>{
...
编辑您不需要额外的捕获,因为您在promise链中返回了额外的承诺,因此如果失败,您的现有catch
将被调用。