queue.js:函数数组之间的区别&一系列的闭包?

时间:2013-03-23 00:05:25

标签: javascript asynchronous queue meteor

因此,我尝试确保在尝试将数据呈现到可视化文件之前发生一系列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个函数,所有看起来像每个插槽中的正确函数 - 被填充(然后在代码中传递,除非推迟, )只有一个实际运行。

这就是我想知道的。好吧,总的来说,为什么只有一个函数在运行8时传递给延迟?但具体而言 - 对闭包有一种朦胧的理解,我真的有一系列功能。有没有我错过的东西,因为文档特别说闭包,这就是为什么所有函数都没有执行?

感谢您关注此事!

1 个答案:

答案 0 :(得分: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;
            }
        });
    };
}

上面的内部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