我该怎么做才能通过进入for循环的ajax发出正确的对象

时间:2014-10-03 07:05:36

标签: ajax for-loop

问题是当ajax调用从URL检索数据时,FOR继续前进,因此只有数组中的最后一个元素才能获取数据。 在这种情况下,如何将for与ajax调用同步?

   for(ii in scope.selMovies){
        for(jj in scope.selMovies[ii]){

            var title = scope.selMovies[ii][jj].title.replace(/\s*\(.*/, "");
            var yearMovie = scope.selMovies[ii][jj].title.match(/\(.*(20|19)[\d]{2}/)[0].replace(/[^\d]/g, "");

            http.jsonp(url + "&query=" + title + callb).
                success(function (data) { console.log( ii, jj, title, data.results );
                    for (k in data.results){
                        if(data.results[k].release_date.substr(0, 4) == yearMovie ) {
                            scope.selMovies[ii][jj].infoes = data.results[k];
                            break;
                        }
                    }

                }
            );

        }
    }

3 个答案:

答案 0 :(得分:1)

AngularJS中的Promise是异步的,因此在回答所有请求后,使用$q.all处理所有响应时,最好使用一堆AJAX请求。

答案 1 :(得分:1)

您的console.log(ii, jj, title, data.results)是否始终显示上一个iijj以及title

问题不在于Ajax调用检索数据时for循环继续进行。问题是.success的{​​{1}}回调函数是一个循环中的闭包,所以它的行为并不像人们想象的那样。

阅读this answer,以便更好地了解正在发生的事情。

要修复您的具体案例,请执行以下操作:

http.jsonp

然后在循环中,将function MakeSuccessFn(scope, ii, jj, yearMovie, title){ return function (data) { console.log( ii, jj, title, data.results ); for (k in data.results){ if(data.results[k].release_date.substr(0, 4) == yearMovie ) { scope.selMovies[ii][jj].infoes = data.results[k]; break; } } }; } 更改为以下

http.jsonp

答案 2 :(得分:1)

您需要围绕ajax调用创建一个闭包,以封装在进行Ajax调用时每次循环迭代时更改的值。试试这个:

for(ii in scope.selMovies){
    for(jj in scope.selMovies[ii]){
        var title = scope.selMovies[ii][jj].title.replace(/\s*\(.*/, "");
        var yearMovie = scope.selMovies[ii][jj].title.match(/\(.*(20|19)[\d]{2}/)[0].replace(/[^\d]/g, "");
        doAjax(ii, jj, title, yearMovie);
         }
}

function doAjax(count1, count2, title, yearMovie) {
    http.jsonp(url + "&query=" + title + callb).
        success(function (data) { console.log( count1, count2, title, data.results );
            for (k in data.results){
                if(data.results[k].release_date.substr(0, 4) == yearMovie ) {
                    scope.selMovies[count1][count2].infoes = data.results[k];
                    break;
                }
            }
        }
}