2015-02-06 2 views
0

Я совершенно новый в javascript, и я еще не нашел ответ на свою проблему.Как сделать что-то после цикла, содержащего асинхронную функцию

На самом деле я использую цикл for для получения содержимого нескольких CSV-файлов и добавляю каждый контент в глобальную csvstring, чтобы загрузить итоговый файл csv в конце. Но содержимое каждого csv получается с d3.csv, который является асинхронным, поэтому, если я обновляю всю итоговую csvstring в d3.csv, я не могу использовать ее для сохранения итогового csv после этого, так как csvstring пока не обновляется. Как мне это сделать?

Мой код, который не работает, состоит в следующем:

//here is code to define the queries 
csvstring = ""; 
for (i=0 ; i<queries.length ; ++i) { 
    d3.csv(queries[i], function(data) { 
    //here is code to format data as a csvstring and then 
    csvstring += data_as_csvstring; 
    } 
}); 
//here is code to download csvstring as a csvfile 

Я надеюсь, что я ясно, и я заранее благодарю за ответ!

Mag

+0

Возможное решение: http://stackoverflow.com/questions/23690356/how-to-load-multiple-csv-files-and-use-them-mixed-with-each-other – Andy

+0

[очереди. js] (https://github.com/mbostock/queue) делает случаи, когда вам нужно легко найти неизвестный номер/много файлов данных. –

ответ

1

Вы могли бы сделать некоторые рекурсии и ждать, пока вы не на последнем запросе, чтобы сделать что-то?

var getCsv = function(queries, csvstring, startAt, callback){ 
     d3.csv(queries[startAt], function(data) { 
      csvstring += data_as_csvstring; 
      if(index == queries.length){ 
       callback(csvstring); 
      } else { 
       getCsv(queries, csvstring, startAt++, callback); 
      } 
     }); 
    } 

getCsv(queries, '', 0, function(csvstring){ 
     console.log(csvstring); //the complete string 
    }); 
+0

Действительно, это рабочее решение! Спасибо, что заставило меня понять понятие обратного вызова, и рекурсия - это действительно хорошая идея! – Magali

Смежные вопросы