从amd module / requirejs返回d3请求的结果

时间:2014-09-26 00:53:42

标签: d3.js requirejs amd

我试图创建一个运行d3 request的amd模块(本例中为d3.json())并返回请求中的数据。我似乎无法弄清楚如何使模块在返回数据之前等待请求完成。因此,当我尝试访问数据时,我在主程序中一直未定义。

define(['app/args'], function(args){

  d3.json("resources/waterData.php?stn=" + args.stationID, function (error, data) {

    var dataToReturn = {};

    //Do some stuff with data

    return dataToReturn;
  });

});

这是我尝试做的基本结构。我认为主要问题是d3.json中的第二个参数是加载数据时的回调,因此当我尝试返回数据时,它不会越过模块。我还没有弄清楚如何从回调中获取数据以将其返回到模块之外。

1 个答案:

答案 0 :(得分:0)

真正的问题是d3.json函数是异步的,因此您不能直接从外部函数返回已处理的数据。解决此问题的一种方法是返回承诺而不是数据本身。您可以使用d3.json回调来解析承诺,然后依赖于数据的其他模块可以注册自己的回调,这些回调将在承诺解决后运行。

例如,如果您使用jQuery的$.Deferred(),则可以执行以下操作:

define(['app/args', 'jquery'], function(args, $){

  // CREATE DEFERRED OBJECT
  var deferred = $.Deferred();

  d3.json("resources/waterData.php?stn=" + args.stationID, function (error, data) {

    var dataToReturn = {};

    //Do some stuff with data

    // RESOLVE NOW THAT THE DATA IS READY
    deferred.resolve(dataToReturn);
  });

  // RETURN THE PROMISE
  return deferred.promise();

});

然后,当您想要使用数据时,可以要求使用上述模块,并注册一旦数据准备好就会触发的侦听器:

require(['nameOfYourModuleAbove'], function(deferred) {

  deferred.done(function(data) {
    // DO SOMETHING WITH YOUR DATA
  });

})