我很抱歉提出一个必须很常见的问题,但是我很难将按值将数组正确传递给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”数组。仅使用包含相同5 + 5值的mdopkt执行zmqPush 5次。
我怎样才能解决这个问题?
谢谢,
最佳答案
问题是您正在尝试在同步for
循环内执行异步代码,因此,在实际发生第一个异步调用时,您的for循环已完成执行。另一个问题是,您需要在每次迭代中重新定义exi,
mdopkt and
md`变量。
要解决此问题,您应该创建一个闭包,并且在CoffeScript中有两种常见的处理方法。
使用Array::forEach
而不是for
循环
[1..5].forEach (exi) ->
# your code
使用
do
keywordfor exi in [1..5] then do (exi) ->
# your code