因此,在尝试将获取的数据呈现到可视化之前,我试图确保发生了一系列HTTP请求。典型的交易,对吧?
我正在使用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个函数被传递来推迟呢?但具体来说,它--对闭包有模糊的理解,我真的有一系列的函数。有什么是我遗漏的吗,因为文档特别提到闭包,这就是为什么所有的函数都没有执行吗?
谢谢你看这个!
发布于 2013-03-23 00:32:38
下面可能是您引用的语句的字面部分,可以在测试套件中找到:
"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
https://stackoverflow.com/questions/15581736
复制相似问题