2016-07-16 31 views
1

我試圖用d3的隊列異步加載一些文件,推遲並等待。問題是試圖在一個循環中這樣做,並在循環的每個項目,存儲在字典中所取得的數據:添加固定的參數來等待回調

var myDictionary = {}; 

// e.g. hierarchy = ["State", "County"] 
hierarchy.forEach(function(geo) { 
    queue() 
     .defer(d3.json, 'assets/data/geo/' + geo + '/' + geo + '.json') 
     .defer(d3.csv, 'assets/data/geo/' + geo + '/' + geo + '_info.csv') 
     .await(myFunc); 
}); 

function myFunc(error, jsonData, csvData) { 
    // need access to geo 
    console.log(geo); 

    myDictionary[geo].jsonData = jsonData; 
    myDictionary[geo].csvData = csvData; 
} 
在myFunc的

,我想獲得地理填寫在相應的鍵字典,但是在.await.myFunc(geo)內傳遞它們將在myFunc中打印undefined

我不知道這個問題是否屬於Javascript的回調函數,或D3的await(),或兩者兼而有之。

有什麼建議嗎?

感謝

回答

2

您可以使用此:

function myFunc(geo) { 

    return function(error, jsonData, csvData) { 
     // geo available here 
     console.log(geo); 

     myDictionary[geo].jsonData = jsonData; 
     myDictionary[geo].csvData = csvData; 
    }; 
}; 

然後:

var myDictionary = {}; 

// e.g. hierarchy = ["State", "County"] 
hierarchy.forEach(function(geo) { 
    queue() 
     .defer(d3.json, 'assets/data/geo/' + geo + '/' + geo + '.json') 
     .defer(d3.csv, 'assets/data/geo/' + geo + '/' + geo + '_info.csv') 
     .await(myFunc(geo)); 
}); 
+0

我將使用這種方法,謝謝! – Khorkhe

0

所以它被傳遞到您的myFunc的你可以將其添加爲一個任務。

queue() 
    .defer(d3.json, 'assets/data/geo/' + geo + '/' + geo + '.json') 
    .defer(d3.csv, 'assets/data/geo/' + geo + '/' + geo + '_info.csv') 
    .defer(callback=>callback(geo)) 
    .await(myFunc); 
... 
function myFunc(error, jsonData, csvData, geo) { 
    console.log(geo); 
} 
+0

這似乎並沒有爲我工作,爲 「未定義」 被打印出來。 'geo'是一個字符串類型。我錯過了什麼嗎? – Khorkhe