我试图创建一个运行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中的第二个参数是加载数据时的回调,因此当我尝试返回数据时,它不会越过模块。我还没有弄清楚如何从回调中获取数据以将其返回到模块之外。
答案 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
});
})