我很抱歉提出一个必须很常见的问题,但是我很难将按值将数组正确传递给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 keyword

for exi in [1..5] then do (exi) ->
  # your code

08-19 13:31