使用D3队列进行跨站点呼叫

时间:2015-12-08 21:09:30

标签: javascript d3.js xmlhttprequest queue

我的队列设置如

queue()
.defer(d3.json, "js/US.json")
.defer(d3.json, "http://192.168.1.40:8080/api/2014", function(d) { dataSet.set(d.id, +d.plant); })
.defer(d3.csv, "data/ph.csv", function(d) { phById.set(d.id, +d.ph); })
.awaitAll(ready);

但是,我的就绪函数永远不会被调用。我的控制台没有错误。我已经做了检查以确保我的数据被返回并且我的dataSet加载了正确的数据。我不明白为什么我的队列从不调用我的准备功能。这里的任何方向都会非常感激。

1 个答案:

答案 0 :(得分:1)

queue.defer()函数将一个额外的回调参数传递给传递给它的任务函数,完成后必须由任务函数调用。在您的情况下,您正在调用d3.json任务函数,并将其传递给两个参数,以及附加的回调参数(感谢queue.defer)。

d3.json方法需要两个参数 - 一个url和一个回调。它将收到三个参数,但只使用前两个。因此,queue.defer()的回调函数不会被调用,queue.awaitAll()函数永远不会将任务视为已完成。

您需要将每个.json和.csv任务的结果传递给最终的回调函数:

queue().defer(d3.json, "js/US.json")
       .defer(d3.json, "http://192.168.1.40:8080/api/2014")
       .defer(d3.csv, "data/ph.csv")
       .awaitAll(ready);

function ready(error, result1, result2, result3) {
  //do some things with your results here - these are the results passed
  //from each task.
}