请求Javascript/Angular遇到异步问题

请求Javascript/Angular遇到异步问题,javascript,json,angularjs,asynchronous,Javascript,Json,Angularjs,Asynchronous,我有一些代码可以执行以下操作。。。。 第一个get调用基本上只是给出了数据中的post列表。然后,对于每一篇文章,都有一些我想在第二次get调用中加载的回复。问题是,它实际上通过了循环,但只加载了最后一个回复 http.get("../api/sortpost/trending").success(function (data){ scope.posts = data; for(var i = 0; i < scope.posts.leng

我有一些代码可以执行以下操作。。。。 第一个get调用基本上只是给出了数据中的post列表。然后,对于每一篇文章,都有一些我想在第二次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
              });
            }
      });
http.get(“../api/sortpost/trending”).success(函数(数据){
scope.posts=数据;
对于(变量i=0;i

有人知道怎么修理吗?我猜我循环太快了,get请求没有足够的时间处理。因此,我的帖子发生了一些有趣的事情。在请求实际完成之前,我和我的回复以及帖子都发生了变化

您的post
{post=scope.posts[i];}
在循环的每个项目上都会被修改。 结果post将是数组作用域中的最后一项。post 例如,
post={some last one}

这就是为什么您只看到一个post请求,因为angular使用相同的url缓存post请求

之所以发生这种情况,是因为您的循环将运行,而get请求将排队,因为javascript是单线程的。在您的循环遍历所有
$http.get
之后,将通过clousers看到相同的值,即post的最后一个值

您可以使用立即调用的函数来解决此问题

    (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);

您的post
{post=scope.posts[i];}
在循环的每个项目上都会被修改。 结果post将是数组作用域中的最后一项。post 例如,
post={some last one}

这就是为什么您只看到一个post请求,因为angular使用相同的url缓存post请求

之所以发生这种情况,是因为您的循环将运行,而get请求将排队,因为javascript是单线程的。在您的循环遍历所有
$http.get
之后,将通过clousers看到相同的值,即post的最后一个值

您可以使用立即调用的函数来解决此问题

    (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);

您的post
{post=scope.posts[i];}
在循环的每个项目上都会被修改。 结果post将是数组作用域中的最后一项。post 例如,
post={some last one}

这就是为什么您只看到一个post请求,因为angular使用相同的url缓存post请求

之所以发生这种情况,是因为您的循环将运行,而get请求将排队,因为javascript是单线程的。在您的循环遍历所有
$http.get
之后,将通过clousers看到相同的值,即post的最后一个值

您可以使用立即调用的函数来解决此问题

    (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);

您的post
{post=scope.posts[i];}
在循环的每个项目上都会被修改。 结果post将是数组作用域中的最后一项。post 例如,
post={some last one}

这就是为什么您只看到一个post请求,因为angular使用相同的url缓存post请求

之所以发生这种情况,是因为您的循环将运行,而get请求将排队,因为javascript是单线程的。在您的循环遍历所有
$http.get
之后,将通过clousers看到相同的值,即post的最后一个值

您可以使用立即调用的函数来解决此问题

    (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);

elclanrs comment正确地解决了这个问题,您可以尝试创建一个Promissions数组并一次执行它们,然后一次获得所有结果的列表:

 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));
 }

elclanrs comment正确地解决了这个问题,您可以尝试创建一个Promissions数组并一次执行它们,然后一次获得所有结果的列表:

 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));
 }

elclanrs comment正确地解决了这个问题,您可以尝试创建一个Promissions数组并一次执行它们,然后一次获得所有结果的列表:

 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));
 }

elclanrs comment正确地解决了这个问题,您可以尝试创建一个Promissions数组并一次执行它们,然后一次获得所有结果的列表:

 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));
 }


看起来像是这个加上这个的组合看起来像是这个加上这个的组合看起来像是这个加上这个的组合看起来像是这个加上这个的组合我会用promises数组取回正确的帖子吗?假设你有链接每个帖子的东西它的回复,例如你的帖子回复(应该)上有类似于
postId
的东西,你可以找出哪些回复属于哪个帖子,但需要更多的代码。所以我确实有,但这需要我每次都通过我所有帖子的整个for循环来检查。(由于其排序基于不同的过滤器,因此顺序混乱)。有更优雅的方法吗?@user3525295如果你想同时返回所有帖子及其回复,为什么不在最初检索帖子时返回帖子本身中每个帖子的回复呢?如果你采用我的方法,你可以尝试按postId对回复进行分组,使用类似的方法,我可能最终会这样做,希望有一个更简单的解决方案我会使用Promissions数组返回正确的帖子吗?假设你有一些东西将每个帖子链接到它的回复,例如你的帖子回复(应该)如果有类似于
postId
的内容,你可以找到哪些回复属于哪个帖子,但需要更多的代码。所以我确实有,但这需要我每次都通过我所有帖子的整个for循环来检查。(由于其排序基于差异,因此顺序混乱