我使用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中包装一两个调用,否则它们就不会执行。我不知道这是否相关,但令人沮丧。
答案 0 :(得分:1)
循环体(在CoffeeScript或JavaScript中)不是闭包,因此当执行异步回调时,id
将具有set
中最后一个元素的值。
在你的例子中,沿着这些方向的东西应该这样做:
promises = []
for id in set
d = $q.defer()
promises.push d.promise
do(id)
mySvc.asyncGetObject id
.then (results) ->
console.log results, id
, id