因此,我尝试确保在尝试将数据呈现到可视化文件之前发生一系列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时传递给延迟?但具体而言 - 对闭包有一种朦胧的理解,我真的有一系列功能。有没有我错过的东西,因为文档特别说闭包,这就是为什么所有函数都没有执行?
感谢您关注此事!
答案 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