我知道Ajax缺少一些东西,但我需要帮助才能理解。在以下代码中,myArray的内容位于标签“A”,但在标签“B”处为空。代码的目的是读取多个csv文件,存储每个文件中的一些值,然后在脚本中使用myArray。我知道Ajax请求(.get)中必定存在vars。感谢
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 :(得分: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.
答案 1 :(得分:0)
问题是当get请求返回时,get回调会异步执行,但get函数下面的代码会在回调之前立即执行。
您可以同步执行将get替换为ajax async = false。这会慢一些,因为每次调用都不会开始,直到前一个调用结束。
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
});
});
答案 2 :(得分:0)
如果您不喜欢async:false方法,可以使用:
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
}
});
});