2016-07-16 8 views
1

d3のキューdeferおよびawaitを使用して、いくつかのファイルを非同期にロードしようとしています。問題は、辞書にフェッチされたデータを格納し、ループ内でループで、各項目のためにそうしようとしている:myFuncというにおけるコールバック待ちの固定パラメータを追加

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; 
} 

、私は中に適切なキーを埋めるために地理へのアクセスを希望します辞書は、.await.myFunc(geo)の中にそれらを渡すと、undefinedがmyFuncの中に印刷されます。

この問題がJavascriptのコールバック関数、D3のawait()、またはその両方に関係しているかどうかわかりません。

推奨事項それはあなたのmyFuncというに渡されるようにするには、タスクとして、それを追加することができ

おかげ

答えて

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

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

関連する問題