阻止javascript承诺的流程执行

时间:2017-05-26 11:16:36

标签: javascript promise

我已获得以下代码:

    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表达式为真时,有没有办法阻止承诺流执行?

2 个答案:

答案 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将被调用。