Javascript d3可重用API内部的变量范围
我正试图根据《开发d3.js边缘》一书为可重用图表创建一个可重用的data manager API。 你可以在这里找到我启发的代码 因此,data manager API如下所示:Javascript d3可重用API内部的变量范围,javascript,namespaces,d3.js,closures,scope,Javascript,Namespaces,D3.js,Closures,Scope,我正试图根据《开发d3.js边缘》一书为可重用图表创建一个可重用的data manager API。 你可以在这里找到我启发的代码 因此,data manager API如下所示: kdd.dataManager = function module(){ var exports = {}, dispatch = d3.dispatch('dataReady', 'dataLoading'), data; exports.loadJsonData = function(
kdd.dataManager = function module(){
var exports = {},
dispatch = d3.dispatch('dataReady', 'dataLoading'),
data;
exports.loadJsonData = function(_uri, _callback){
d3.json(_uri, function(_err, _data){
_callback(_data);
});
};
exports.loadCsvData = function(_file, _cleaningFunc){
if(!_cleaningFunc) _cleaningFunc = function(d){
return d;
};
var loadCsv = d3.csv(_file);
loadCsv.on('progress', function(){
dispatch.dataLoading(d3.event.loaded);
});
loadCsv.get(function(_err, _response){
_response.forEach(function(d){
_cleaningFunc(d);
});
// assign the data response to our data variable
data = _response;
dispatch.dataReady(_response);
});
};
//access the data
exports.getCleanedData = function(){
return data;
};
d3.rebind(exports, dispatch, 'on');
return exports;
};
问题是,当我使用getCleanedData()方法时,我得到了“undefined”,只有当我在exports.loadCsv.get()中记录数据变量时,我才能得到正确的数据
实际上,我可以将回调函数传递给get函数,该函数在加载数据时会应用一些逻辑。但通常考虑到名称空间内的变量范围,数据变量应该可以从loadCsv.get方法外部访问
你能检查一下有什么问题吗!
谢谢和问候
穆罕默德·阿里(Mohamed Ali)您试图在数据加载之前访问它
newDataManager.loadCsvData(file);
启动异步加载数据的请求。一旦启动该请求(但在下载之前),将执行下一行代码:
console.log(newDataManager.getCleanedData());
它正在寻找尚不存在的数据
如果要访问loadCsvData回调之外的cleanedData,可以侦听dataReady
事件:
newDataManager.on('dataReady', function(data) {
console.log(newDataManager.getCleanedData()); });
谢谢,它可以工作,但是我如何在API函数getCleanedData()中包装它,我的意思是我不想让API的用户这样做,我尝试了这个导出。getCleanedData=function(){this.on('dataReady',function(data){return data;};};但它不起作用,我不知道你在问什么;您心目中的API用户是谁?我不知道你会如何隐藏从他们那里加载远程数据的异步特性。好的,这是一个很好的观点!我会同意你的建议,谢谢你的帮助!
newDataManager.on('dataReady', function(data) {
console.log(newDataManager.getCleanedData()); });