角度异步调用的时间问题

时间:2015-05-05 20:58:00

标签: javascript angularjs asynchronous promise

我使用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中包装一两个调用,否则它们就不会执行。我不知道这是否相关,但令人沮丧。

1 个答案:

答案 0 :(得分:1)

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

这是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