node.js で頻繁に使用される非同期関数呼び出しのイディオムは、次のようなコールバック関数を使用することです。
library.doSomething(params, function(err,result) {
if (err) {
... handle error, retry etc
} else {
... process results, be happy!
}
});
これは素晴らしいことです。何かを呼び出してから、後で結果またはエラーを処理します。残念ながら、除外された 3 番目のオプションがあります...呼び出したコードがコールバックを実行しないというものです。コールバックが呼び出されない可能性を処理する最善の方法は何ですか?
多くの場合、特にネットワークに依存するライブラリを作成している場合は、渡されたコールバックを一度だけ呼び出すことを保証する必要があります。それを念頭に置いて、次のようなパターンが進むべき道のように見えます。
// set a timout
var failed = false, callbackFailure = setTimeout(function() {
... handle failure, call further pending callbacks with a timeout error
failed = true;
},30000);
library.doSomething(params, function(err,result) {
if (!failed) {
clearTimeout(callbackFailure);
if (err) {
... handle error, retry etc
} else {
... process results, be happy again!
}
}
});
起動するコールバックが実際に起動するのは信頼の問題のようです。すべてのプログラマーは、宇宙線、太陽黒点、ネットワーク障害、バグなど、何らかの理由でコールバックが実行されないというシナリオに遭遇したことがあると確信しています。サード パーティのライブラリ、または ...あえぎ... 独自のコードのバグ。
私のコード例のようなものは、実際に採用するのに適した方法ですか、それとも node.js コミュニティはそれを処理するためのより良い方法を既に見つけていますか?