Javascript d3可重用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(

我正试图根据《开发d3.js边缘》一书为可重用图表创建一个可重用的data manager API。 你可以在这里找到我启发的代码

因此,data manager 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()方法时,我得到了“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()); });