0

我正在尝试根据“开发 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 方法外部访问数据变量。

你能检查一下有什么问题吗!感谢和问候穆罕默德·阿里

4

1 回答 1

0

您正在尝试在数据有机会加载之前访问数据。

newDataManager.loadCsvData(file);

发起异步加载数据的请求。一旦发起该请求(但在下载之前),下一行代码将执行:

console.log(newDataManager.getCleanedData());

它正在寻找尚不存在的数据。

如果你想在 loadCsvData 回调之外访问cleanedData,你可以监听dataReady事件:

newDataManager.on('dataReady', function(data) {
  console.log(newDataManager.getCleanedData()); });
于 2013-09-12T13:54:36.297 回答