【问题标题】:Promise still go to the next chain after I return res.end()在我返回 res.end() 后,Promise 仍然会进入下一个链
【发布时间】:2017-04-30 12:56:54
【问题描述】:

我在 node 中使用 bluebird 和 express ,当我返回 res.end() 时,Promise 仍然进入下一个链,这是我的代码:

Promise.resolve(operate).then(function(data){
    if (!!data && data.length !=0) {
        log.info('success');
        return true;
    }else {
        log.warn('fail');
        return res.end();
    }
}).then(function(data){
    if(data) {
        log.info('done');
        return res.end();
    }else {
        log.warn('fail');
        return res.end();
    }
})

如果失败,我在日志中有 2 个“失败”,如果我第一次得到“失败”,我该如何让它停止?谢谢!

蓝鸟版本:~2.10.2; 节点:4.3.1; 快递:~4.2.0

【问题讨论】:

    标签: javascript node.js express promise bluebird


    【解决方案1】:

    您可以返回错误或拒绝的承诺,而不是 res.end。这将跳过所有成功处理程序,直到 Promise 链结束(从技术上讲,直到第一个拒绝处理程序):

    Promise.resolve()
      .then(() => Promise.reject())
      .then(
         () => console.log('this does not run'), // <-- success handler
         () => console.log('this runs')          // <-- rejection handler
      );

    所以在你的代码中:

    Promise.resolve(operate).then(function(data){
      if (!!data && data.length !=0) {
        log.info('success');
        return true;
      } else {
        log.warn('fail');
        res.end();
        return Promise.reject(/* optionally pass an error */); // <--- return rejected promise
      }
    }).then(function(data){
      // this won't run if previous promise rejects
    })
    

    【讨论】:

    • 谢谢!可以阻止链条关闭,但我在日志中收到“未处理的拒绝错误”,我该如何处理?
    • 这不是真正的问题,一些浏览器会记录未处理的承诺错误,但这只会显示在您的日志中,不会以任何方式影响代码。如果您不想看到它,您可以添加一个空的拒绝处理程序或一个不执行任何操作的 catch 子句。查看 Antonio Val 的 答案以获得更好的方法。
    【解决方案2】:

    根据定义,then 方法总是返回一个 Promise,因此链将继续。

    正如已经指出的那样,您可以拒绝承诺,然后再抓住它。如果错误处理在所有情况下都相同,您可以在链的末尾使用catch(无论如何,在末尾放置一个catch 被认为是一种好习惯)。

    Promise.resolve(operate).then(function(data){
        if (!!data && data.length !=0) {
            log.info('success');
            return true;
        } else {
            return Promise.reject('fail');
        }
    })
    .then(function(data) {
        // true is being returned above so it will enter here always
        // I guessed something instead of true could come here
        if(data) {
            log.info('done');
            return res.end();
        } else {
            return Promise.reject('fail'); 
        }
    })
    .catch(function(err) {
        log.warn(err);
        return res.end();
    });
    

    在这种情况下,返回被拒绝的 Promise 似乎是合法的,但根据具体情况,不建议返回被拒绝的 Promise 以逃离 Promise 链,因为它可能与真正的拒绝混合。在这种情况下,重组您的连锁店可能是最佳选择。

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      相关资源
      最近更新 更多