5

我一直试图了解Mike Bostock 的 queue.js是如何工作的,但我看不出它是如何工作的。我不明白的部分是代码如何设法继续执行回调。特别是,我不确定该pop()方法(第 45 行)。据我了解,该方法采用下一个未处理的延迟函数;附加一个回调(可能)启动队列中的下一个延迟函数,并在立即弹出的函数完成时执行;然后最终执行所述功能。我的问题是:什么代码执行这个回调?

4

2 回答 2

10

每个延迟函数实际上并不返回任何东西——它们被期望以回调的形式执行它们的最后一个参数。例如,这将不起作用

var foo = function(i) {
  console.log(i);
  return i;
}
var finished = function(error, results) {
  console.log(results);
}

queue(2)
  .defer(foo, 1)
  .defer(foo, 2)
  .defer(foo, 3)
  .defer(foo, 4)
  .awaitAll(finished);  // only prints "1" and "2", since foo() doesn't execute callbacks

但是,如果我们修改foo为采用回调,

var foo = function(i, callback) {
  console.log(i);
  callback(null, i);  // first argument is error reason, second is result
}

然后它会,因为执行回调会导致queue继续。

于 2012-12-23T19:42:29.833 回答
2

如果我正确理解代码,queue.await()并将queue.awaitall()回调放在await实例变量中,然后由notify().

于 2012-12-23T06:46:33.363 回答