我 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 链,因为它可能与真正的拒绝混合在一起。在这种情况下,重组您的连锁店可能是最好的选择。
我在带有 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 链,因为它可能与真正的拒绝混合在一起。在这种情况下,重组您的连锁店可能是最好的选择。