如何与d3.js同步加载JSON数据?

时间:2013-03-07 01:12:07

标签: json xmlhttprequest d3.js synchronous

当我的网站首次初始化时,它会查询服务器以获取一些数据。在此数据恢复之前,我无法在页面上放置任何内容。使用d3.js,我可以使用d3.json()来获取我的数据,但由于它是异步的,我需要将整个页面逻辑放在回调函数中。我如何请求数据并等待它返回?

2 个答案:

答案 0 :(得分:4)

你基本上只是这样做。回调函数必须是启动代码其余部分的函数。但是,您不需要回调函数中的所有代码,您可以引入间接。因此回调函数将调用另一个函数,其中将是当前回调函数中的函数。

答案 1 :(得分:4)

建议不要在JavaScript中使用同步请求,因为它会阻止整个线程,同时也无法完成任何操作。用户也可能无法与网页良好地交互。

如果它真的是你想要的,你可以执行以下操作(使用jQuery):

var jsonData;
jQuery.ajax({
  dataType: "json",
  url: "jsondatafile.json",
  async: false
  success: function(data){jsonData = data}
});

然而,即使是jQuery也不推荐使用,如jQuery.ajax() documentation

所述
  

Ajax中的第一个字母代表“异步”,意味着操作并行发生,并且无法保证完成顺序。 $ .ajax()的async选项默认为true,表示在发出请求后代码执行可以继续。强烈建议不要将此选项设置为false(从而使调用不再异步),因为它可能导致浏览器无响应。

作为最后一点,我没有看到是什么阻止你以异步方式使用success属性中的任何函数。大多数时候改变你的设计以使用异步请求是值得的。根据经验,调试使用同步请求的页面很痛苦(特别是当请求没有得到答复时......)。