2

私はNode.jsが初めてで、実行の最後に次のステップが行われるプロセスで(繰り返し)ループを実行するための規定の方法論が何であるかに興味がありますが、すべての反復のコールバックが行われた後にのみ解雇した。

具体的には、SQL呼び出しを行っており、一連の挿入と更新を行った後にSQL接続を閉じる必要がありますが、それらはすべて非同期であるため、実際にすべてがいつ完了したかを知る方法がありません。セッションで end() を呼び出すことができます。

明らかに、これはこの特定の例をはるかに超えた問題であるため、SQLに関する特定の解決策を探しているのではなく、これまでのところ私が困惑している一般的な方法を探しています。

私が今行っていることは、実際にはグローバル カウンターをループ オブジェクトの長さに設定し、各コールバックでそれをデクリメントして、それがいつゼロになるかを確認することですが、それは本当にぎこちなく感じます。 Javascript 中心の) 方法でこの監視を実現します。

ティア

4

2 に答える 2

1

この種のことを支援するためにパターンを適用する利用可能なフロー制御ライブラリがたくさんあります。私のお気に入りはasyncです。たとえば、一連の SQL クエリを順番に実行したい場合は、次のようにしますseries

async.series([
  function(cb) { sql.exec("SOME SQL", cb) },
  function(cb) { sql.exec("SOME MORE SQL", cb) },
  function(cb) { sql.exec("SOME OTHER SQL", cb) }
], function(err, results) {
  // Here, one of two things are true:
  // (1) one of the async functions passed in an error to its callback
  //     so async immediately calls this callback with a non-null "err" value
  // (2) all of the async code is done, and "results" is
  //     an array of each of the results passed to the callbacks
});
于 2012-08-27T20:55:53.800 に答える
1

これを行うために独自のキュー ライブラリを作成し (近日中に公開します)、基本的にクエリをキュー (基本的には配列) にプッシュし、削除されるたびにクエリを実行し、配列が空のときにコールバックを発生させます。

それをするのにそれほど時間はかかりません。

*編集。このサンプルコードを追加しました。これは私が以前に使用したものではなく、実際に試したこともありませんが、出発点になるはずです。パターンでできることは他にもたくさんあります。

注意すべきことが1つあります。キューイングは効果的にアクションを同期させ、次々と発生します。mysql キュー スクリプトを作成したので、複数のテーブルに対してクエリを非同期に実行できますが、任意の 1 つのテーブルに対して同期してクエリを実行できるため、要求された順序で挿入と選択が行われます。

var queue = function() {
    this.queue = [];

    /**
     * Allows you to pass a callback to run, which is executed at the end
     * This example uses a pattern where errors are returned from the 
     * functions added to the queue and then are passed to the callback 
     * for handling.
     */
    this.run = function(callback){
        var i = 0;
        var errors = [];

        while (this.queue.length > 0) {
            errors[errors.length] = this.queue[i]();
            delete this.queue[i];
            i++;
        }
        callback(errors);
    }

    this.addToQueue = function(callback){
        this.queue[this.queue.length] = callback;
    }
}

使用する:

var q = new queue();
q.addToQueue(function(){
    setTimeout(function(){alert('1');}, 100);
});

q.addToQueue(function(){
    setTimeout(function(){alert('2');}, 50);
});

q.run();
于 2012-08-27T20:59:27.763 に答える