そこで、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()
}
);
}
かなり大きくて醜くて、標準だと思っていたものを実装するためのモジュールが必要だと思ったので、もっと良い方法はないかと思います。私はまだ非同期の方法で考えていますか?私が見落としたノードに何か簡単なものはありますか?これを行う標準的な方法はありますか?
この設定では、プログラムが複雑になると、プログラムのフローを記述するためのネスト関数がたくさんあり、すべてをレイアウトするための良い方法を見つけるのに苦労していると思います。
ヒントをいただければ幸いです。