ユースケースの1つでエラー処理を改善するために、node.jsモジュールに変更を加える作業を行っています。モジュールの詳細は実際には関係ありませんが、私がやりたいことの1つは、APIリクエストへの応答から特定のステータスコードを受信したときに遅延再試行をトリガーすることです。これを行うために、timeOut関数を使用して、一定期間後に関数への新しい呼び出しをトリガーしています。
コードの構造は次のようになります。
Outer function (parameters specified by client application)
——API request (using parameters)
——Callback from API request (response with status code)
——If error, set timeout to call outer function after delay
However, I also want to handle the case that the outer function is called again while waiting for the timeout. I don't want any calls to trigger a new API request while a timeout is pending, but I do want the parameters from the most recent call to be used when the timeout finishes.
モジュールに対してグローバルな変数を使用して、これを機能させることができました。新しい呼び出しが外部関数に着信するたびに、新しいパラメーターでグローバルオブジェクトを更新し、タイムアウトが保留中の場合は、APIリクエストを呼び出さずに戻ります。タイムアウト関数は、設定されたときのパラメーターではなく、グローバルオブジェクトのパラメーターを使用して外部関数を呼び出します。このようにして、外部関数に渡された最新の値を常に使用しますが、重複するAPI呼び出しは行いません。
これは、グローバル変数を使用してこの動作を実現した簡単な例です:JSFiddle。「失敗応答」が表示されるまで実行を数回押してから、タイムアウトをトリガーします。
これは機能しますが、より良い方法がある場合は、これらのグローバル変数をモジュールに追加したくありません。
これと同じ動作を実現する方法はありますが、グローバルを使用せずにすべての状態を外部関数にカプセル化していますか?また、誰かがアイデアを持っている場合は、これを処理する方法を完全に再考することもできます。
外部関数の外部に変数を作成せずにこれを行うことはできませんが、グローバルスコープを汚染せずにこれらの変数を作成することは可能です。
これを行うには、外部関数を、すぐに実行される別の関数(IIFEと呼ばれることもあります)でラップします。
mainFunction: (function() {
var savedParam1;
var savedParam2;
var savedParam3;
var pendingTimeout = false;
return function(param1, param2, param3) {
savedParam1 = param1;
savedParam2 = param2;
savedParam3 = param3;
if (pendingTimeout) {
log('pending timeout -- ignoring new call');
return;
}
/* and so on */
}
})(); // the () causes the outer function to run immediately,
// which creates a scope for the savedParam / pendingTimeout variables,
// and then returns the inner function (your old outer function)
// to be used for mainFunction
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加