2016-07-16 16 views
1

Ich versuche, einige Dateien asynchron mit der Warteschlange d3 zu laden, zu verschieben und abzuwarten. Das Problem versucht, so in einer Schleife zu tun, und für jedes Element in der Schleife, speichert die abgerufenen Daten im Wörterbuch:festen Parameter hinzufügen, um Callback zu erwarten

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

in myFunc, würde ich Zugang gerne in den entsprechenden Tasten zu füllen, um geo in das Wörterbuch, jedoch übergibt sie innerhalb .await.myFunc(geo) würde undefined in myFunc drucken.

Ich weiß nicht, ob dieses Problem zu Javascript Callback-Funktionen, oder D3 wartet(), oder beides.

Irgendwelche Empfehlungen?

Dank

Antwort

2

Sie können diese verwenden:

function myFunc(geo) { 

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

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

Dann:

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

Ich werde diesen Ansatz verwenden, danke! – Khorkhe

0

Man könnte es als eine Aufgabe hinzufügen, damit es in Ihrem myFunc geben wird.

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

dies offenbar nicht für mich zu arbeiten, als "undefiniert" gedruckt wird. 'geo' ist ein String-Typ. Fehle ich etwas? – Khorkhe