Javascript 承诺在我返回res.end()后仍然转到下一个链
我在节点中与express一起使用bluebird,当我返回res.end()时,Promise仍会转到下一个链,下面是我的代码: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');
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();
});