setTimeout按值传递数组(在咖啡中)

时间:2014-11-26 00:37:30

标签: javascript arrays coffeescript

很抱歉发布一个必须如此常见的问题,但我很难按值正确地将数组传递给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值。

我该如何解决这个问题?

谢谢,

1 个答案:

答案 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