2016-07-05 51 views
1

如果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

你可以给更多的上下文而不仅仅是说失败。拒绝函数会在被调用时从uploadLogs()返回的promise被拒绝。 – M22an

回答

1

成功或拒绝处理程序的调用是基于承诺是否已成功解析。但是他们的孩子被称为他们的成功功能,这意味着在那个时候已经决定父功能是成功的,所以没有理由突然失败父功能,仅仅因为孩子做的事情是失败。

所以不行,它不应该以这种方式工作,如果你要用常规的同步设置替换承诺的话,那就不会这样。你不会指望这会像你期望的那样承诺,对吧?

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

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