请求Javascript / Angular运行Async内容的问题

时间:2015-01-19 07:58:37

标签: javascript json angularjs asynchronous

我有一些代码可以执行以下操作.... 第一个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发生了一些有趣的事情,并且在请求实际完成之前,帖子正在发生变化。

2 个答案:

答案 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);