问题是当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;
}
}
}
);
}
}
答案 0 :(得分:1)
AngularJS中的Promise是异步的,因此在回答所有请求后,使用$q.all处理所有响应时,最好使用一堆AJAX请求。
答案 1 :(得分:1)
您的console.log(ii, jj, title, data.results)
是否始终显示上一个ii
和jj
以及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;
}
}
}
}