很抱歉发布一个非常常见的问题,但我很难将数组按值正确传递给 setTimeout 函数:
for exi in [1..5]
# I just re-create an array at each iteration
mdopkt = [
exi + 5,
]
delay = (ms, func) -> setTimeout func, ms
sendpkt = (st) ->
arg = EJSON.stringify st
root.zmqPush.send arg
md = mdopkt.slice(0)
foo = -> sendpkt md
delay 1000, foo
上面的代码不起作用,因为“mdopkt”数组在延迟结束之前被更改。 zmqPush 仅使用包含相同 5+5 值的 mdopkt 执行 5 次。
我该如何解决这个问题?
谢谢
最佳答案
问题是您尝试在同步 for
循环内执行异步代码,因此当第一个异步调用实际发生时,您的 for 循环已经完成执行。另一个问题是您在每次迭代中重新定义 exi、
mdopkt 和
md` 变量。
要解决此问题,您应该创建一个闭包,在 CoffeScript 中有两种常见的方法可以实现此目的。
使用Array::forEach
而不是 for
循环
[1..5].forEach (exi) ->
# your code
使用do
keyword
for exi in [1..5] then do (exi) ->
# your code
关于javascript - setTimeout 按值传递数组(在咖啡中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27139413/