在成功回调中创建的Ajax外部访问数组

时间:2017-02-17 07:12:22

标签: javascript arrays ajax

我在JavaScript中有一个CSV解析函数,它从CSV获取数据(电影名称)并使用循环中的Ajax调用获取数据。

movies = new Array();

for (var i = 1; i < allData.length; i++) {
    var mName = allData[i][0];
    var mPath = allData[i][1];
    // console.log(decodeURIComponent(mName));

    $.get(apiCall, function showData(data) {
        if (data) {
            mData = data.results;
            if (mData.length > 1) {
                var urlData = new URLSearchParams(this.url);
                var movie_name = urlData.get('query');
                movies.push(movie_name);
            }
        }
    })
}

如果数据获得了超过一条电影的记录,它将把它保存为数组中的冲突。

问题是,我可以访问内部if中的电影数组(但它是迭代的,因此我无法使用它),并且在循环结束时它无法访问。我怎样才能访问它?

3 个答案:

答案 0 :(得分:3)

你不应该在for循环中进行api调用。而是这样做,

   movies = new Array();

    function makeApiCallForEntireArray(index, arr, cb){
        if(arr.length == index){
           cb(true);
           return;
        }

        $.get(apiCall, function showData(data) {
        if (data) {
            mData = data.results;
            if (mData.length > 1) {
                var urlData = new URLSearchParams(this.url);
                var movie_name = urlData.get('query');
                movies.push(movie_name);
            }
        }
        makeApiCallForEntireArray(index+1, arr, cb);
    })
    }

    makeApiCallForEntireArray(0, allData, function(){
       //api calls finished
       //movie accesssible here with all the data
    });

答案 1 :(得分:0)

由于ajax请求仍在进行中,您将无法在循环结束时访问movies数组中添加的内容。您需要以其他方式执行此操作,以便确保asynch ajax调用的结束。

答案 2 :(得分:0)

我将在Can't get the summation in for loop

的问题中使用@Jaromanda X的答案
Promise.all(allData.map(function(d) {
     return $.get(apiCall, function showData(data){
        return data.results;
     });
})).then(function(res) {
    //push your movies here...the result of your apiCall is inside the res variable
});