请求Javascript/Angular遇到异步问题

Request Javascript/Angular running into problems with Async stuff

本文关键字:异步 问题 遇到 Angular Javascript 请求      更新时间:2023-09-26

我有一些代码可以执行以下操作....第一个获取调用基本上只是给出了数据中的帖子列表。然后对于每个帖子,我想在第二个 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);