You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS跨请求迭代器位置未重置问题技术问询

嘿,这问题我太熟了!一眼就看出是var的“老毛病”在搞鬼😎

问题出在哪?

你代码里的for (var lightId in lights)用了var声明循环变量,而var是函数作用域的——也就是说,这个lightId属于整个回调函数的作用域,不是每次循环迭代都新建一个独立的变量。

第一次请求时,你遍历到lightId=6找到了目标,循环中断,但这个lightId的值会一直留在回调函数的作用域里。等第二次请求触发回调时,for...in循环会直接从上次停下的位置(也就是6之后的7)开始遍历,这就是为什么你看到第二次输出从7开头。

怎么修复?

把var换成let就行!let是块级作用域的,每次循环迭代都会创建一个全新的lightId变量,这样每次回调执行时,循环都会从数组的第一个元素开始遍历:

result.findAllLights(function (lights) { 
  console.log("got callback"); 
  var send = false; 
  // 这里的delete lightId完全没必要,删掉也没关系
  console.log("PRE-LOOP = " + JSON.stringify(lights)); 
  // 关键改动:var → let
  for (let lightId in lights) { 
    console.log("checking " + lightId);
    // ... 你的匹配逻辑(找到目标后跳出循环的代码)
  }
});

另外提一句:你原来写的delete lightId其实没用,var声明的变量是函数作用域的属性,delete操作符删不掉它。换成let之后,这个语句直接删掉就行,不影响逻辑。

内容的提问来源于stack exchange,提问作者noahp78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:00:16