为什么拒绝不起泡?

时间:2016-07-05 06:24:54

标签: javascript angularjs

如果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();
    });

是不是承诺链接和拒绝冒泡应该以这种方式工作?

1 个答案:

答案 0 :(得分:1)

根据他们的承诺是否成功解决,调用成功或拒绝处理程序。但是他们的孩子在他们的成功函数中被调用,这意味着在那时已经确定父函数是成功的,所以没有理由突然失败父函数,只是因为孩子所做的事情是失败的。

所以不,它不应该以这种方式工作,如果你用常规的同步设置替换promises,那就不会有了。你不会期望这种行为与你对预期的期望一样,对吗?

if( persist() ) {
  if( upload() ) {
    closeApp();
  }
  else {
    console.log('This would obviously not go into the below else for persist().');
  }
}
else {
  closeApp();
}

这大致是一个承诺模拟的行为,只是以异步方式。