我有一些代码可以执行以下操作.... 第一个get调用基本上只是给出了数据中的帖子列表。然后对于每个帖子,我想要通过第二次接听电话加载一些回复。问题是,它实际上经历了循环,但只加载了最后一个回复。
http.get("../api/sortpost/trending").success(function (data){
scope.posts = data;
for(var i = 0; i < scope.posts.length; i++){
post=scope.posts[i];
console.log(i); //prints 1 to i as expected
http.get("/api/postreply/"+post.id).success(function (data){
post.replies = data;
console.log(i); //prints i only i number of times
});
}
});
任何人都知道如何解决?我猜测我循环过快并且get请求没有足够的时间来处理。因此,我的post.replies和i发生了一些有趣的事情,并且在请求实际完成之前,帖子正在发生变化。
答案 0 :(得分:2)
elclanrs评论正确地解决了这个问题,您可以尝试制作一个promises数组并立即执行它们,然后立即获取所有结果的列表:
var promisesArray=[];
for(var i = 0; i < scope.posts.length; i++) {
post=scope.posts[i];
console.log(i); //prints 1 to i as expected
promisesArray.push(http.get("/api/postreply/"+post.id));
}
然后:
$q.all(promisesArray).then(function(aggregateData){
console.log(aggregateData);
})
答案 1 :(得分:1)
您的帖子{ post=scope.posts[i];}
正在修改循环的每个项目。
生成的帖子将是数组scope.posts中的最后一项
即。 post = {some last one}
这就是为什么你只看到一个帖子请求,因为角度缓存使用相同网址的帖子请求。
这种情况正在发生,因为你的循环会运行并且获取请求将排队,因为javascript是单线程的。循环结束后,$http.get
将看到相同的值,即通过clousers发布的最后一个值。
您可以使用立即调用的函数来解决此问题。
(function(myPost){
http.get("/api/postreply/"+myPost.id).success(function (data){
post.replies = data;
console.log(i); //prints i only i number of times
});
})(post);