angular 异步调用的计时问题

Timing issues with angular asynchronous calls

我在使用 Angular 进行异步调用时遇到了奇怪的计时问题。

我有一个 ID 数组:

set = [1,2]

我遍历这个集合并为每个 ID 进行异步调用:

promises = []
for id in set
  d = $q.defer()
  promises.push d.promise
  mySvc.asyncGetObject id
  .then (results) ->
     console.log results, id
     # results doesnt correspond with the ID

在 .then() 块中,当我期望得到 id==2 的对象时,我实际上得到的是 id==1 的对象。我已经对此进行了彻底的追踪,但没有任何意义。我查看了网络面板 - 正确进行了 HTTP 调用。我从调用中获得的结果与我在代码中获得的结果不匹配。

这可能是什么原因造成的?我过去遇到过一个问题,我试图更新一些 HTML 元素,我不得不在 setTimeout 中包装一两个调用,否则它们不会执行。我不知道这是否相关,但令人沮丧。

循环体(在 CoffeeScript 或 JavaScript 中)不是闭包,因此当执行异步回调时,id 将具有 [=12= 中最后一个元素的值].

这里是good article about this.

在您的示例中,应该遵循以下原则:

promises = []
for id in set
  d = $q.defer()
  promises.push d.promise
  do(id)
    mySvc.asyncGetObject id
      .then (results) ->
         console.log results, id
  , id