我正在尝试根据“开发 d3.js Edge”一书为可重用图表创建可重用数据管理器 API。你可以在这个Github 存储库中找到我的灵感来源。
所以数据管理器 API 是这样的:
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() 方法时,我得到“未定义”,并且只有在控制台记录 export.loadCsv.get() 中的数据变量时才能获得正确的数据。
var newDataManager = kdd.dataManager();
var file= "data/sp500.csv";
newDataManager.loadCsvData(file);
console.log(newDataManager.getCleanedData());
我实际上可以将回调函数传递给 get 函数,该函数将在加载数据时应用一些逻辑。但通常考虑到名称空间内的变量范围,应该可以从 loadCsv.get 方法外部访问数据变量。
你能检查一下有什么问题吗!感谢和问候穆罕默德·阿里