Bluebird Promises による非同期例外処理
次のシナリオを考えてみましょう。アプリケーションをクラッシュさせることなく、制御された環境で例外を処理する必要があります。 Bluebird Promise を使用して、この特定の例を調べてみましょう。
<code class="javascript">var Promise = require('bluebird'); function getPromise(){ return new Promise(function(done, reject){ setTimeout(function(){ throw new Error("AJAJAJA"); }, 500); }); }</code>
setTimeout コールバック内で例外がスローされると、その例外は Node.js イベント ループによってキャプチャされ、コンソールに記録され、プログラムがクラッシュします。
$ node bluebird.js c:\blp\rplus\bbcode\scratchboard\bluebird.js:6 throw new Error("AJAJAJA"); ^ Error: AJAJAJA at null._onTimeout (c:\blp\rplus\bbcode\scratchboard\bluebird.js:6:23) at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
ただし、Promise は、コンストラクター コールバック内からスローされた例外をキャプチャできます。非同期コールバック内でスローされた例外を処理するには、エラー時に拒否する Promise でコールバックをラップする必要があります。
<code class="javascript">function getPromise(){ return new Promise(function(done, reject){ setTimeout(function(){ done(); }, 500); }).then(function() { console.log("hihihihi"); throw new Error("Oh no!"); }); }</code>
この変更された例では、例外は周囲の Promise チェーンによってキャッチされます:
$ node bluebird.js Error [Error: Oh no!]
Promise は非同期コールバックからの例外をキャッチしないことに注意してください。このような場合は常に周囲の Promise を拒否し、必要に応じて try-catch ブロックを使用してください。このアプローチにより、アプリケーションをクラッシュさせることなく例外が適切に処理されます。
以上がBluebird Promise で非同期コールバックの例外を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。