【问题标题】:Set timeouts on all elements in an array in node.js [duplicate]在node.js中为数组中的所有元素设置超时[重复]
【发布时间】:2016-09-09 17:33:20
【问题描述】:

node.js 新手在这里。我正在遍历一组对象,并为单独使用每个对象执行一些操作设置超时,每个对象的超时也取决于对象中的某些键值。代码在这里:

for (var idx in arr) {
var obj = arr[idx];
interval = obj['key'];
setTimeout(function(){my_func(obj);}, interval);
}

现在这里失败的是,每当发生超时并且调用 my_func 的代码块时,它总是作用于数组中的最后一个对象,可能是因为当时的变量 'obj' 指向它。我该如何解决这个问题?我猜我需要通过引用传递,或类似的东西。如果我在这里遗漏了什么,请指出正确的方向。

【问题讨论】:

  • 由于你使用的是Node,所以使用let而不是var,问题就解决了。顺便说一句,这与“通过引用传递”(JavaScript 无论如何都没有)无关。

标签: javascript node.js settimeout pass-by-reference


【解决方案1】:

您需要为此使用闭包:

for (var idx in arr) {
  var obj = arr[idx];

  (function( obj ){
    interval = obj['key'];
    setTimeout(function(){my_func(obj);}, interval);
  })( obj );
}//for()

【讨论】:

  • 代码正确,但解释不正确。闭包的工作方式是这里的问题。传递给setTimeout 的函数已经是一个闭包。我们需要的是每次迭代都有一个新的作用域,而调用一个函数给了我们这个。 that 函数是否是闭包几乎无关紧要。
  • 谢谢大家。我同意菲利克斯的观点。这个链接解决了我的问题,主要是你们在这里建议的stackoverflow.com/questions/750486/…
  • 好的。谢谢@FelixKling,我会尝试更多地研究它。
猜你喜欢
  • 2014-01-16
  • 2017-02-01
  • 2017-08-06
  • 2011-03-22
  • 2018-01-23
  • 2020-05-08
  • 2016-08-06
  • 2018-05-05
  • 2021-07-18
相关资源
最近更新 更多