1

そのため、取得したデータをビジュアライゼーションにレンダリングする前に、一連のHTTPGETリクエストが発生することを確認しようとしています。典型的な取引ですよね?

私はqueue.jsを使用しており、queue.js githubページ(https://github.com/mbostock/queue)でこれを確認しています。

または、何億もの非同期タスク(ここではクロージャの配列として表されます)をシリアルに実行したい場合は、次のようにします。

    var q = queue(1);
    tasks.forEach(function(t) { q.defer(t); });
    q.awaitAll(function(error, results) { console.log("all done!"); });

Queue.jsは、Node.js内またはブラウザーで実行できます。

それで、私がしたことは、それぞれがMeteor.http.get呼び出し(私はMeteor.jsを使用しているので)を含む関数の配列を作成し、次にこの行を1行ずつ追跡しました。

何が起こっているのかというと、8つの関数が含まれ、すべてが各スロットに適切な関数のように見える配列にデータが入力されている間(そして、延期するためのコードのように渡されます)、1つだけです。実際に実行されます。

これが私が疑問に思っていることです。さて、全体として、延期するために8つが渡されるのに、なぜ1つの関数しか実行されないのでしょうか。しかし、具体的には、クロージャをぼんやりと理解しているので、私は実際に一連の関数を持っています。ドキュメントにはクロージャが具体的に記載されているので、私が見逃したものはありますか?それがすべての関数が実行されていない理由ですか?

これを見てくれてありがとう!

4

1 に答える 1

1

これはおそらく、あなたが引用したステートメントの文字通りの部分であり、テストスイートにあります。

"queue of asynchronous closures, processed serially": {
    topic: function() {
        var tasks = [], 
            task = asynchronousTask(),
            n = 10,
            q = queue(1);

        while (--n >= 0) tasks.push(task);

        tasks.forEach(function(t) { q.defer(t); });

        q.awaitAll(this.callback)
    },
    "does not fail": function(error, results) {
        assert.isNull(error);
    },
    "executes all tasks in series": function(error, results) {
        assert.deepEqual(results, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]);
    }
},

https://github.com/mbostock/queue/blob/master/test/queue-test.js#L103

実行task = asynchronousTask()されるのは、キューからプルされて呼び出されるものです

function asynchronousTask() {
    var active = 0;

    return function(callback) {
        ++active;

        process.nextTick(function() {
            try {
                callback(null, active);
            } finally {
              --active;
            }
        });
    };
}

上記のinnerは、各非同期関数がキューから呼び出されるときに、外部変数への参照をスコープ内に保持するクロージャーreturn function() {...}として参照されていると私が信じているものです。active

もちろん、これはコールバックとハンドラーの点でかなり強力です。たとえば、返された関数の数やリストが使い果たされたときなど、ローカルで共有される変数を維持および操作する手段を提供するためです。 。言い換えれば、キュー。

以下は上の例では使用されていませんが、synchronousTask上記の関数との違いを確認するための参照ポイントとして使用してください。

function synchronousTask() {
    var active = 0;

    return function(callback) {
        try {
            callback(null, ++active);
        } finally {
            --active;
        }
    };
}

https://github.com/mbostock/queue/blob/master/test/queue-test.js#L265

于 2013-03-23T00:32:38.633 に答える