2016-11-25 8 views
0

私は約束を返すリソースローダー関数を作成しています。関数は、エラーログを行います。Howtoは約束を拒否し、履行チェーンを停止する?

function load(url) { 
    return request(..) 
     .catch(function(error) { 
      log(error); 
      throw error; 
     }); 
} 

機能は、様々なチェーンで使用されます。

load(a).then(function(res1) { 
    load(b).then(function(res2) { 
     // res1 + res2 
    }); 
}); 

私はリソース例外をログに記録し、そこに約束チェーンを停止することができるようにしたいと思います。私がそれを沈黙させるとチェーンはthenにつながります。もし私が再び投げれば、それは未処理の拒絶であることが判明します。 ノードのprocessを介してそれらをグローバルに取得することは、プラットフォーム上の他のライブラリが依存する可能性があるため、オプションではありません。

拒否反応を抑止しても、履行チェーンが続かないようにすることはできますか?

+0

「未処理の拒否」を止めるためにチェーンに最終的なキャッチを追加します - しかし、私が見た限り、未処理の拒否はコード実行に影響を与えません。これは非同期とにかく "停止"したいコードのチェーン - この重要でないコンソールエラーを防ぐ必要がある何らかの理由はありますか?編集:ちょうど実現、これはnodejsの質問です - ごめんなさい –

+0

unhandledRejectionイベントは、そうでなければ飲み込まれるエラーを記録するためにあります。それはプログラミングフックとして意図されていません。それに応じて他のコードを心配する必要はありませんが、クリーンアップする必要があります。 "このような失敗に対処するには、操作不可能な.catch(()=> {})ハンドラがresource.loadedにアタッチされ、 'unhandledRejection'イベントが発生しないようにすることができます。 – teppic

答えて

0

標準ES6の約束はわずか3つの結果ました:

  1. は解決しませんか拒否決して
  2. 拒否
  3. を解決しました。

解決または拒否されると、ハンドラを呼び出さないようにECMAScript標準方法はありません。

.abort()メソッドまたは.cancel()メソッドをサポートするサードパーティの約束ライブラリがいくつかあります。たとえば、Bluebird 3.xには.cancel()というメソッドがあり、チェーンを停止し、その約束のためにハンドラを呼び出しません。

標準の約束を使用してこれを処理する通常の方法は、チェーンが進行してはならないことを示す既知の解決済みまたは拒否状態を作成してすぐにリンクされたハンドラが特定の状態を確認できるようにすることです。 .cancel()の機能を標準の約束に追加するには、.cancel()メソッドを追加し、.then().catch()を上書きして、ハンドラを呼び出す前にキャンセル状態を確認してください。

関連する問題