1

因此,我试图确保在尝试将数据呈现到可视化之前发生一系列 HTTP GET 请求。典型的交易,对吧?

我正在使用 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),然后逐行执行。

似乎正在发生的事情是,虽然我的数组——其中有 8 个函数,每个插槽中都有正确的函数——被填充(然后像在代码中一样传递给 defer,)只有一个实际运行。

这就是我想知道的。好吧,总的来说,为什么只有一个函数在运行,尽管传递了 8 个函数来延迟?但具体来说——对闭包有一个模糊的理解,我真的有很多函数。有什么我错过的吗,因为文档特别提到了闭包,这就是为什么所有函数都没有执行的原因?

谢谢你看这个!

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;
            }
        });
    };
}

上面,innerreturn 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 回答