2016-07-05 55 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(); 
} 

這大致是一個承諾模擬的行爲,只是以異步的方式。