很抱歉发布一个必须如此常见的问题,但我很难按值正确地将数组传递给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次,mdopkt包含相同的5 + 5值。
我该如何解决这个问题?
谢谢,
答案 0 :(得分:1)
问题在于您尝试在同步for
循环内执行异步代码,因此在第一次异步调用实际发生时,您的for循环已经完成执行。另一个问题是您在每次迭代时重新定义了exi,
mdopkt and
md`变量。
要解决此问题,您应该创建一个闭包,在CoffeScript中有两种常见的方法。
Array::forEach
代替for
循环[1..5].forEach (exi) ->
# your code
do
keyword for exi in [1..5] then do (exi) ->
# your code