离开后.get数组丢失数据

After leaving .get array loses data

本文关键字:数据 数组 get 离开      更新时间:2023-09-26

我知道有一些我错过了Ajax,但我需要帮助来理解。在下面的代码中,myArray的内容位于标签"A"处,但在标签"B"处为空。该代码的目的是读取多个csv文件,从每个文件中存储一些值,并在稍后的脚本中使用myArray。我知道Ajax请求(.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 ---
});

$.get是异步的。

任何位于B的代码将在get发生时运行。

在提供给get的函数中放置任何想要对MyArray进行操作的代码,或者在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.

问题是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
    });
});

如果你不喜欢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
        }
    });
});