我 return res.end() 之后 Promise 仍然会进入下一个链

Promise still go to the next chain after I return res.end()

我在带有 express 的节点中使用 bluebird,当我 return 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个'fail'如果它失败了,如果我第一次得到'fail'如何让它停止?谢谢!

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

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

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
})

根据定义,then 方法总是 return 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 似乎是合法的,但根据情况 return 不推荐使用被拒绝的 Promise 来逃避 Promise 链,因为它可能与真正的拒绝混合在一起。在这种情况下,重组您的连锁店可能是最好的选择。