在我返回res.end()之后,Promise仍然会进入下一个链。

我在express中使用bluebird,当我返回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

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

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

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

正如已经指出的那样,你可以拒绝这个诺言,然后再抓住它。 如果error handling在所有情况下都是相同的,那么你可以在链的末尾使用一个catch (不pipe怎么说,把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(); }); 

在这种情况下,回避被拒绝的承诺似乎是合法的,但根据情况返回一个被拒绝的承诺逃避承诺链不能被推荐,因为它可以混合真正的拒绝。 在这种情况下,重组您的连锁店可能是最好的select。