2013-04-27 67 views
0

我知道我缺少关于Ajax的东西,但我需要帮助才能理解。在下面的代码中,myArray的标签为“A”,但标签为“B”时为空。代码的目的是读取多个csv文件,存储每个文件的一些值,并稍后在脚本中使用myArray。我知道在Ajax请求(.get)中必须有一些变量。谢谢离开后.get数组丢失数据

var myArray = []; 
var lines = []; 

$.each(fileNames, function(lineNo, file) 
{ 
    $.get(file, function(data) 
    { 
     lines = $.csv.toObjects(data); 
     $.each(lines, function(lineNo, line) 
     { 
      ... code ... 
      myArray.push(someValue); 
     }); 
     --- A --- 
    }); 
    --- B --- 
}); 

回答

0

$.get是异步的。

任何放在B的代码都会在发生get时运行。

将您想要在MyArray上执行的任何代码放在提供给get的函数中,或者在get函数中放置另一个调用以处理您的数据。

$.get(file, function(data) 
{ 
    lines = $.csv.toObjects(data); 
    $.each(lines, function(lineNo, line) 
    { 
     ... code ... 
     myArray.push(someValue); 
    }); 

    // myArray is ready here. Place any code that acts on it here... 
}); 

// myArray may not be ready here, since the `get` hasn't finished yet. 
0

的问题是,当GET请求返回,但get调用下面的代码被执行向右走,回调前的GET回调被异步执行。

你可以用ajax async = false同步替换get来执行。这将会慢一点,因为每次通话都不会开始,直到前一次结束。

var myArray = []; 
var lines = []; 

$.each(fileNames, function(lineNo, file) 
{ 
    $.ajax({ 
      url: file, 
      success: function(data) { 
        lines = $.csv.toObjects(data); 
        $.each(lines, function(lineNo, line) 
          { 
           ... code ... 
           myArray.push(someValue); 
          }); 
        }, 
      async:false 
    }); 
}); 
+0

这不是一个好足够的理由来关闭异步功能。 – 2013-04-29 14:39:25

0

如果你不喜欢异步:假的方式,你可以这样做:

var myArray = []; 
var lines = []; 
var count = 0; 

$.each(fileNames, function(lineNo, file) 
{ 
    $.get(file, function(data) 
    { 
     lines = $.csv.toObjects(data); 
     $.each(lines, function(lineNo, line) 
     { 
      ... code ... 
      myArray.push(someValue); 
     }); 
    }).done(function(){ 
     count++; 
     if(count > fileNames.lenght){ 
      // Code to use array goes here 
     } 
    }); 
});