2016-11-13 3 views
2

各状態で2つの異なるアクションを実行するために、JavaScriptコードに2つのステートハンドラファンクションを実装しようとしています。これは、Javaの状態設計パターン(https://sourcemaking.com/design_patterns/state)に似ています。NodeJS - 再帰における約束チェーンのコスト

概念的には、私のプログラムはelasticsearchインスタンス(またはそのような他のサーバー)に接続したままにしておき、入力データを解析してPOSTする必要があります。 elasticsearchに利用できる接続がない場合、私のプログラムは何回かの再試行期間で無限にelに接続するようにしています。一言で言えば

  • 接続されていない場合は、メイン実行ループが

    、recurssively自身を呼び出している

データを投稿を開始、接続しているとき

  • を接続しようとし続けます
    function run(ctx) { 
        logger.info("run: running..."); 
        // initially starts with disconnected state... 
        return ctx.curState.run(ctx) 
        .then(function(result) { 
         if (result) ctx.curState = connectedSt; 
         // else it remains in old state. 
         return run(ctx); 
        }); 
    } 
    

    これは真に再帰的なfnではないという意味で、各呼び出しはタイトなループで自分自身を呼び出す。しかし、私はそれがチェーン内の多くの約束事で終わると思うし、長期的にはより多くのメモリを消費し、結果として最終的にハングするだろう。

    1. 私の前提/理解は正しいですか?あるいは、このようなコードを書いてもいいですか?
    2. そうでない場合は、setImmediate/process.nextTickなどの呼び出しを検討する必要がありますか?
    3. TCO(Tail Cost Optimization)の使用を検討する必要がありますか?もちろん、私はまだこの概念を完全に理解していません。
  • +0

    '.then()'は非同期であることが保証されているので、既に 'setImmediate()'のようなことをしています。 – jfriend00

    +0

    このループのポイントは何ですか?あなたは最終的に何らかの結果を達成しようとしており、それを発信者に伝えていますか?あるいは、この構造を繰り返し使って何度も繰り返していますか? – jfriend00

    +0

    本当は、私はちょうど1つの状態または他の状態にとどまることによって永遠に実行するプログラムをしたい。 –

    答えて

    3

    はい、新しい約束(run()への再帰呼び出しの結果)を返すことによって、別の約束を効果的に連鎖させることができます。

    setImmediate()でもprocess.nextTick()もこれを直接解決するつもりはありません。

    run()に再度電話するときは、単にreturnを入力しないと問題ありません。

    関連する問題