2

そこで、Node.jsで小さなプロジェクトを開始して、それについて少し学びました。ノードが手間のかかる作業のほとんどを提供するため、これはarchlinuxのパッケージシステム用の単純なキャッシングプロキシです。

これには、サーバーのセットアップとサービスという2つの「主要な」フェーズがあります。次に、サービングには、応答のセットアップと応答の2つの主要なフェーズがあります。

「メイン」セットアップには、いくつかのファイルのチェック、ファイルからのいくつかの構成のロードが含まれます。Webアドレスからjsonをロードしています。次に、この情報を使用してhttpサーバーとプロキシインスタンスを起動します。

  • セットアップロガー/オプション-構成の読み取り-ミラーの読み取り-ウェブミラーの読み取り
  • 提供を開始

サービングには、要求をチェックしてファイルが存在するかどうかを確認し、必要に応じてディレクトリを作成してから、応答を提供することが含まれます。

  • チェックリクエスト-チェックディレクトリ-チェックファイル
  • プロキシリクエストまたはサーブファイル

私はそれらを同期ポイントと呼び続けていますが、検索は多くの結果につながりません。プロセスが次のステップを完了する前に、一連の非同期タスクを終了する必要があるポイント。PerlのAnyEventには条件変数があり、これは私がブロックせずにやろうとしていることだと思います。

そもそも、提供されている機能の同期バージョンを「不正行為」して使用していることに気づきましたが、それはWebリクエストで停止する必要があったため、再構築を開始しました。すぐにほとんどの検索は、フローを制御するために非同期またはステップを使用することにつながりました。最初に、私は多くの直列/並列セットアップを試していましたが、関数の下に非同期呼び出しがあると問題が発生し、すぐに「完了」してシリーズが終了しました。

多くの嘆きと歯ぎしりの後、私は次の関数を起動する前に終了するすべてのタスクによって設定されるプログラム状態をテストするまで、async.untilを使用する「ウェイター」関数に行き着きました。

// wait for "test" to be true, execute "run", 
// bail after "count" tries, waiting "sleep" ms between tries;
function waiter( test, run, count, sleep, message ) {
    var i=0;
    async.until( 
        function () {
            if ( i > count ) { return true; }
            logger.debug('waiting for',message, test() );
            return test();  
        },
        function (callback) {
            i++;
            setTimeout(callback, sleep );
        },
        function (err) {
            if ( i > count ) {
                logger.error('timeout for', message, count*sleep );
                return;
            }
            run()
        }
    );
}

かなり大きくて醜くて、標準だと思っていたものを実装するためのモジュールが必要だと思ったので、もっと良い方法はないかと思います。私はまだ非同期の方法で考えていますか?私が見落としたノードに何か簡単なものはありますか?これを行う標準的な方法はありますか?

この設定では、プログラムが複雑になると、プログラムのフローを記述するためのネスト関数がたくさんあり、すべてをレイアウトするための良い方法を見つけるのに苦労していると思います。

ヒントをいただければ幸いです。

4

1 に答える 1

3

すべてを同期させることは実際にはできません。Nodejs は非同期で実行するように設計されています (もちろん、これは時々あなたを苦しめるかもしれません)。ただし、同期的に機能させる方法はいくつかあります (疑似コードがよく考えられており、コードが慎重に設計されている場合)。

  • コールバックの使用
  • イベントの使用
  • プロミスの使用

コールバックとイベントは使いやすく、理解しやすいものです。しかし、これらを使用すると、コードが非常に煩雑になり、デバッグが困難になることがあります。

しかし、約束があれば、それをすべて避けることができます。「プロミス」と呼ばれる依存関係チェーンを作成できます (たとえば、プロミス A が完了したときにのみプロミス B を実行します)。

以前のバージョンの node.js には promise が実装されていました。彼らはいくつかの作業を行うことを約束し、成功と失敗、およびタイムアウトの処理に対して実行される個別のコールバックを用意しました。

しかし、それ以降のバージョンでは、それが削除されました。それらをコア node.js から削除することで、コアの上に配置できる promise のさまざまな実装でモジュールを構築する可能性が生まれました。これらのいくつかはnode-promisefutures、およびpromisesです。

詳細については、次のリンクを参照してください。

于 2013-02-27T12:09:45.927 に答える