离开.get数组后丢失数据

时间:2013-04-27 23:55:10

标签: javascript ajax csv

我知道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 ---
});

3 个答案:

答案 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
        }
    });
});