2016-07-05 8 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()の拒否ハンドラによって処理されている場合、それはいくつかの理由で」doesnのt。

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

あなたは単に失敗するという文脈より多くの文脈を与えることができますか? rejectLog関数は、uploadLogs()から返される約束が拒否されると呼び出されます。 – M22an

答えて

1

約束が正常に解決されたかどうかに基づいて、成功または拒否ハンドラが呼び出されます。しかし、彼らの子どもたちは成功関数の中で呼び出されます。その時点で、親関数が成功であるとすでに決定されているので、子関数が失敗したために突然親関数に失敗する理由はありません。

このようにする必要はありません。約束事を通常の同期セットアップに置き換える場合には、それ以上の効果があります。あなたはこれが約束で期待したように行動するとは思わないでしょうか?

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

これはおおまかには、約束事がシミュレートする動作ですが、ちょうど非同期で行われます。

関連する問題