所以我在绘制d3图时遇到了并发问题。我的页面可以完美地运行一个图表,但是遇到了多个问题。这是获取json的相关代码。
json_fetching_id = "json/";
json_fetching_id += json_ids.splice(0, 1);
//here is where the d3 is grabbing the json file.
d3.json(json_fetching_id, function(error, json){
if (error) return console.warn(error);
results = results.concat(json);
callback(results); //the callback function draws the graphs.
});
console.info("Retrieving JSON file " + id);
如果我在回调函数中有一个断点,代码会正确地执行多个图形的预期显示,这使我相信它是一个并发问题。
上述函数在for循环中调用我需要绘制的每个数据条目。我关心的是,在调试时,调试器会跳过d3.json调用,而不是执行回调函数。它遍历整个for循环,不执行回调,然后在for循环完成后执行d3.json调用 - >这是我认为并发问题来自哪里。所以我的问题是,是否有一种方法可以确保在转到for循环中的下一个项目之前执行d3.json及其回调,而不是在结束时执行所有操作?
答案 0 :(得分:1)
回调函数在浏览器检索JSON文件后异步执行。同时,您的for
循环继续。这是预期的行为。在所有文件都被检索之后,您需要推迟执行。根据您的偏好和可用的库,您可以使用任何Promises库或jQuery $.Deferred
。如果你想坚持D3.js生态系统,Mike Bostock已经为此目的发布了queue.js库。该图书馆的README.md
包含了一个恰好是您的用例的示例。