CSV для массива - JQuery и AJAX проблема - PullRequest
2 голосов
/ 13 июня 2011

Я пытаюсь реализовать функцию, которая будет загружать сохраненный на сервере CSV-файл и анализировать его в массив.У меня есть некоторые проблемы с этим, и я был бы признателен за помощь.

Вот как выглядит функция на данный момент:

  function getSeries(filename){
   //create an array where objects will be stored.
   var seriesInFile=[];
   $.get('/public/csv/'+filename+'.csv',
        function(data) {
            // Split the lines
            var lines = data.split('\n');
            $.each(lines, function(lineNo, line) {
                var items = line.split(',');
                //elements from each line are taken and stored
                series = {
                             //some other attributes here, I took them off for this example
                             data: []
                         }
                $.each(items, function(itemNo, item) {
                        series.data.push(parseFloat(item));
                });
               seriesInFile.push(series);
            });
        console.log(seriesInFile); //it works here!
        });
     return seriesInFile;
    }; 
   console.log(getSeries('hr'));
   console.log(getSeries('hr'));

Итак, проблема в том, что, хотя я успешно получаю информациюиз файла CSV и сохраните его в файле seriesInFile в функции $ .each, как только я выйду из него, он больше не будет работать - целая функция возвращает пустой массив.Я думаю, это может быть связано с тем, что функция get () была развернута чуть позже, чем оригинальная getSeries.Есть ли простое решение для этого?

Спасибо,

Ответы [ 2 ]

1 голос
/ 13 июня 2011

Как правильно заметил Никола Пелучетти, запрос GET является асинхронным.Это означает, что он начинается, когда вы звоните $.get, но если заканчивается позже.Функция getSeries сразу возвращается.На данный момент массив все еще пуст, потому что запрос GET еще не завершен.

Что бы вы ни хотели сделать с проанализированными данными CSV, вы должны инициировать его из обратного вызова запроса GET, а неиз функции, которая вызвала getSeries (что лучше было бы назвать startSeriesRetrieval).

Так что это может выглядеть так (displaySeries вызывается для дальнейшей работы с полученными данными):

function startSeriesRetrieval(filename) {
  $.get('/public/csv/'+filename+'.csv',
    function(data) {
      // Split the lines
      var lines = data.split('\n');
      var seriesInFile=[];
      $.each(lines, function(lineNo, line) {
        var items = line.split(',');
        //elements from each line are taken and stored
        series = {
          //some other attributes here, I took them off for this example
          data: []
        }
        $.each(items, function(itemNo, item) {
          series.data.push(parseFloat(item));
        });
        seriesInFile.push(series);
      });
      displaySeries(seriesInFile);
    }
  );
}; 
1 голос
/ 13 июня 2011

Я думаю, что вы должны вернуть seriesInFile из функции обратного вызова $ .GET

  function getSeries(filename){
   //create an array where objects will be stored.
   var seriesInFile=[];
   $.get('/public/csv/'+filename+'.csv',
        function(data) {
            // Split the lines
            var lines = data.split('\n');
            $.each(lines, function(lineNo, line) {
                var items = line.split(',');
                //elements from each line are taken and stored
                series = {
                             //some other attributes here, I took them off for this example
                             data: []
                         }
                $.each(items, function(itemNo, item) {
                        series.data.push(parseFloat(item));
                });
               seriesInFile.push(series);
            });
        console.log(seriesInFile); //it works here!
        // do what you need to do with seriesInfile here 
        //like calling a function to display it

        });
      //here seriesInFile is an empty array; 
    }; 

Поскольку $ .GET выполняет асинхронный вызов на сервер, весь остальной код выполняется: в вашем примере вы возвращаете seriesInFile как пустой массив, потому что ваша функция не ожидает завершения вызова AJAX и просто возвращает seriesInFile как вы заявили это. Если вы хотите вернуть его, вы должны сделать это в функции обратного вызова $ .GET, которая выполняется при успешном вызове AJAX.

РЕДАКТИРОВАТЬ - Как предлагается в комментарии, возврат из обратного вызова, вероятно, не работает (никогда не пробовал). Обычно вы должны делать все, что вам нужно, прямо из функции обратного вызова (это то, что я обычно делаю). Если вам нужна помощь с чем-то конкретным, я могу помочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...