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

setTimeout pass array by value (in coffee)

本文关键字:咖啡 按值传递 数组 setTimeout      更新时间:2023-09-26

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

我该如何解决这个问题?

谢谢

问题是您正在尝试在同步for循环中执行异步代码,因此当第一次异步调用实际发生时,您的 for 循环已经完成了执行。另一个问题是,您在每次迭代中重新定义exi, mdopkt and md' 变量。

要解决此问题,您应该创建一个闭包,并且在 CoffeScript 中有两种常用方法可以做到这一点。

使用Array::forEach而不是for循环

[1..5].forEach (exi) ->
  # your code

使用do关键字

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