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

标签 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+5 值的 mdopkt 执行 5 次。

我该如何解决这个问题?

谢谢

最佳答案

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

要解决此问题,您应该创建一个闭包,在 CoffeScript 中有两种常见的方法可以实现此目的。

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

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

使用do keyword

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

关于javascript - setTimeout 按值传递数组(在咖啡中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27139413/

相关文章:

c++ - C++中枚举数组的初始化

javascript - 在javascript中动态创建带有字符串索引的二维表

node.js - 保留 Async.js 中的范围

javascript - jQuery 与 Rails/Coffeescript 绑定(bind)事件?

javascript - JavaScript 中的 MVC : model returns undefined

javascript - Json编码数据在js中循环

javascript - angularjs ui-router父状态,参数在子状态后加载

javascript - 如何在 JavaScript 中强制程序等待 HTTP 请求完成?

javascript - 如何使用jade中的变量调用数组的值

javascript - 如何将计算值绑定(bind)到 Angular.js 中的 ng-model 字段,以便我可以使用 Ruby on Rails 将完整的表单详细信息保存在数据库中