0

我知道我缺少关于 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 ---
});
4

3 回答 3

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
    });
});
于 2013-04-28T01:58:31.730 回答
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.
于 2013-04-28T00:04:09.437 回答
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
        }
    });
});
于 2013-04-29T15:12:13.197 回答