请求Javascript/Angular遇到异步问题
Request Javascript/Angular running into problems with Async stuff
我有一些代码可以执行以下操作....第一个获取调用基本上只是给出了数据中的帖子列表。然后对于每个帖子,我想在第二个 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 发生了一些有趣的事情,我和帖子在请求实际完成之前正在更改。
elclans 注释正确解决了这个问题,您可以尝试创建一个 promise 数组并一次执行它们,然后一次获得所有结果的列表:
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);
})
您的帖子{ post=scope.posts[i];}
正在对循环的每个项目进行修改。生成的帖子将是数组 scope.posts 中的最后一项。即。 post = {some last one}
这就是为什么您只看到一个帖子请求的原因,因为角度会使用相同的 url 缓存发布请求。
发生这种情况是因为您的循环将运行并且 get 请求将排队,因为 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);
相关文章:
- JavaScript异步问题
- javasctipt-返回值的异步问题
- 直接 Web 远程处理异步问题
- Javascript奇怪的行为,异步问题
- AngularJS:下载二进制图像时出现异步问题
- 请求Javascript/Angular遇到异步问题
- 猫鼬 + 节点.js:异步问题
- JavaScript 访问 Angular 范围返回“未定义” - 异步问题
- Javascript Hacker News API 的异步问题
- 阵列的异步问题
- 通过异步问题使用jQuery$.ajax从MysQL检索数据
- Node.js get请求问题(异步问题?)
- 为什么在React's #setState中使用函数来解决异步问题?
- Jquery /javascript播放/停止异步问题
- 将数据传递给node.js回调——异步问题
- webdriver.IO异步问题-点击一个元素,然后输入文本
- 访问全局变量和异步问题
- jQuery的执行顺序使用$.load()异步问题(bootstrap modal)
- JSONP使用-范围或异步问题?使用JQuery
- Javascript esriRequest (dojo)在函数异步问题