グローバルを使用せずに、JavaScriptコールバックが戻る前にパラメーターを更新する

サム

ユースケースの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]

編集
0

コメントを追加

0

関連記事

分類Dev

グローバルを使用せずに、JavaScriptコールバックが戻る前にパラメーターを更新する

分類Dev

コールバックメソッドを使用せずにグーグルマップをロードする

分類Dev

fitメソッドでコールバックを使用せずにTensorboardにKerasグラフを表示する

分類Dev

グローバル変数を使用せずにコールバックからデータを取得するにはどうすればよいですか?

分類Dev

Javascriptがパラメータをコールバック関数に渡す

分類Dev

コールバック関数にパラメーターを追加する

分類Dev

関数コールバックにパラメーターを追加する方法

分類Dev

設定を使用せずに前のバージョンにロールバックする

分類Dev

サーバーを中断せずに、Gradleコマンドラインパラメーターを使用してSpringBootをデバッグする方法

分類Dev

Tkinterでグローバルパラメータを使用する代わりに

分類Dev

Pythonコールバックにパラメータを追加する

分類Dev

グローバルを使用せずに関数のデータを保存する

分類Dev

JavaScript:コールバック関数にパラメーターを渡す

分類Dev

JavaScript:コールバックに追加のパラメーターを渡す方法

分類Dev

jsonpを使用して$ .ajaxにコールバックパラメーターを追加する

分類Dev

jQueryがコールバックに追加のパラメーターを渡す

分類Dev

NodeJSが追加のパラメーターをコールバックに渡す

分類Dev

パラメータとして渡されるコールバックにパラメータを渡す

分類Dev

コールバックにパラメータを渡すtkk

分類Dev

Android:バックスタック(フラグメント)を使用すると、ドローアブルセレクターが更新されません

分類Dev

コントローラでコールバックせずにサービスでpromiseを解決する

分類Dev

Visual Studioデバッガーは、dotPeekを使用してサードパーティの分解されたコードをデバッグするときに、パラメーターまたはローカル変数を表示できません。

分類Dev

PayTMゲートウェイが支払いを要求せずにコールバックURLに戻る

分類Dev

Promisesを使用せずにコールバックを順番に実行する

分類Dev

ctypesコールバックを使用してPythonからC出力パラメーターの値を更新するにはどうすればよいですか?

分類Dev

javascriptコールバックと仮パラメータを理解する

分類Dev

角度のあるドラッグアンドドロップ-onStartコールバック関数にパラメーターを渡す方法

分類Dev

$ .ajaxでサーバーにグローバルに送信する前に、Jqueryがデータオブジェクトをオーバーライドします

分類Dev

グローバル変数を使用せずに関数内でPHPクラスメソッドを使用するにはどうすればよいですか?

Related 関連記事

  1. 1

    グローバルを使用せずに、JavaScriptコールバックが戻る前にパラメーターを更新する

  2. 2

    コールバックメソッドを使用せずにグーグルマップをロードする

  3. 3

    fitメソッドでコールバックを使用せずにTensorboardにKerasグラフを表示する

  4. 4

    グローバル変数を使用せずにコールバックからデータを取得するにはどうすればよいですか?

  5. 5

    Javascriptがパラメータをコールバック関数に渡す

  6. 6

    コールバック関数にパラメーターを追加する

  7. 7

    関数コールバックにパラメーターを追加する方法

  8. 8

    設定を使用せずに前のバージョンにロールバックする

  9. 9

    サーバーを中断せずに、Gradleコマンドラインパラメーターを使用してSpringBootをデバッグする方法

  10. 10

    Tkinterでグローバルパラメータを使用する代わりに

  11. 11

    Pythonコールバックにパラメータを追加する

  12. 12

    グローバルを使用せずに関数のデータを保存する

  13. 13

    JavaScript:コールバック関数にパラメーターを渡す

  14. 14

    JavaScript:コールバックに追加のパラメーターを渡す方法

  15. 15

    jsonpを使用して$ .ajaxにコールバックパラメーターを追加する

  16. 16

    jQueryがコールバックに追加のパラメーターを渡す

  17. 17

    NodeJSが追加のパラメーターをコールバックに渡す

  18. 18

    パラメータとして渡されるコールバックにパラメータを渡す

  19. 19

    コールバックにパラメータを渡すtkk

  20. 20

    Android:バックスタック(フラグメント)を使用すると、ドローアブルセレクターが更新されません

  21. 21

    コントローラでコールバックせずにサービスでpromiseを解決する

  22. 22

    Visual Studioデバッガーは、dotPeekを使用してサードパーティの分解されたコードをデバッグするときに、パラメーターまたはローカル変数を表示できません。

  23. 23

    PayTMゲートウェイが支払いを要求せずにコールバックURLに戻る

  24. 24

    Promisesを使用せずにコールバックを順番に実行する

  25. 25

    ctypesコールバックを使用してPythonからC出力パラメーターの値を更新するにはどうすればよいですか?

  26. 26

    javascriptコールバックと仮パラメータを理解する

  27. 27

    角度のあるドラッグアンドドロップ-onStartコールバック関数にパラメーターを渡す方法

  28. 28

    $ .ajaxでサーバーにグローバルに送信する前に、Jqueryがデータオブジェクトをオーバーライドします

  29. 29

    グローバル変数を使用せずに関数内でPHPクラスメソッドを使用するにはどうすればよいですか?

ホットタグ

アーカイブ