Comment puis-je assurer que D3 termine de charger plusieurs CSV avant que javascript ne s'exécute?

Je charge un CSV d'une liste d' autres fichiers CSV en javascript en utilisant D3.

Lorsque je lance le code suivant, le tableau des employés est toujours vide au moment où il le trouve dans le code. Existe-t-il un moyen correct de s'assurer que D3 finit de charger les données avant que le javascript ne se poursuive?

var employees = []; //Retrieve the file list of all the csvs in the data directory, then run a callback on them function retrieveList(url,callback) { d3.csv(url,function(data) { callback(data); }) } //Parse a file list, and then update the employee array with the data within function parseList(filenames){ filenames.forEach(function(d) { d3.csv(d.filename,function(data) { data.forEach(function(d) employees.push(d.name)); } } } //Run this code var filenamesUrl = "http://.../filenames.csv" retrieveList(filenamesUrl, parseList); console.log(employees); //This logs "[]" 

Si je charge la page dans Chrome, quand j'entre dans la console et connecte les employés, bien sûr, il renvoie le tableau rempli de noms. Comment puis-je faire le cas au moment où je cours console.log (employés) sur la dernière ligne?

Vous pouvez utiliser queue.js pour collecter les résultats de tous les appels d3.csv:

 function parseList(filenames){ var q = queue(); filenames.forEach(function(d) { //add your csv call to the queue q.defer(function(callback) { d3.csv(d.filename,function(res) { callback(null, res) }); }); }); q.await(restOfCode) } function restOfCode(err, results) { //results is an array of each of your csv results console.log(results) } 

Votre code semble bon. C'est juste que vous tuez les employees avant que les données ne soient prêtes. Mais si vous console.log . console.log le sur la dernière ligne de parseList vous devriez l'avoir.