Javascript 承诺在我返回res.end()后仍然转到下一个链

Javascript 承诺在我返回res.end()后仍然转到下一个链,javascript,node.js,express,promise,bluebird,Javascript,Node.js,Express,Promise,Bluebird,我在节点中与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');

我在节点中与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;
express:~4.2.0

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

Promise.resolve()
.然后(()=>Promise.reject())
.那么(

()=>console.log('this not run'),//console.log('this runs')//根据定义,
then
方法总是返回一个承诺,因此链将继续

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


在这种情况下,回复被拒绝的承诺似乎是合法的,但根据情况,返回被拒绝的承诺以逃避承诺链是不可取的,因为它可能与真正的拒绝混合在一起。在这种情况下,重组你的承诺链可能是最好的选择。

谢谢!这可以阻止承诺链崩溃,但我得到了一个建议“未处理的拒绝错误"在日志中,我如何处理它?这不是一个真正的问题,一些浏览器日志承诺没有处理的错误,但这只显示在您的日志中,不会以任何方式影响代码。如果您不想看到它,可以添加一个空的拒绝处理程序或一个不起任何作用的
catch
子句。看看Antonio Val对r一个更好的方法。
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();
});