如果function uploadLogs()
被拒绝,我预计拒绝会冒出来并由function reject(reason)
处理,但事实并非如此。为什么不呢?
function uploadLogs()
的拒绝处理程序处理拒绝:
return EventCollector.persist().then(function persistResolve() {
return EventCollector.uploadLogs().then(function uploadLogsResolve() {
return closeApp();
}, function rejectionHandler() {
console.log("this rejection handler handles the event")
});
}, function reject(reason) {
return closeApp();
});
但是如果我删除拒绝处理程序并期望拒绝冒泡并由persist()
的拒绝处理程序处理,那么由于某种原因它不会。
return EventCollector.persist().then(function persistResolve() {
return EventCollector.uploadLogs().then(function uploadLogsResolve() {
return closeApp();
});
}, function reject(reason) {
console.log("rejection is not handled when uploadLogs() fails");
return closeApp();
});
是不是承诺链接和拒绝冒泡应该以这种方式工作?
答案 0 :(得分:1)
根据他们的承诺是否成功解决,调用成功或拒绝处理程序。但是他们的孩子在他们的成功函数中被调用,这意味着在那时已经确定父函数是成功的,所以没有理由突然失败父函数,只是因为孩子所做的事情是失败的。
所以不,它不应该以这种方式工作,如果你用常规的同步设置替换promises,那就不会有了。你不会期望这种行为与你对预期的期望一样,对吗?
if( persist() ) {
if( upload() ) {
closeApp();
}
else {
console.log('This would obviously not go into the below else for persist().');
}
}
else {
closeApp();
}
这大致是一个承诺模拟的行为,只是以异步方式。