Node.js:如何循环处理传入的数据?

时间:2013-10-04 00:07:40

标签: javascript node.js

我收到了这条评论:

在处理传入数据时Node.js的服务器端,如果你想使用for循环,你必须在匿名函数中创建i,否则你会想知道如何你的变量i是否大于限制它在你的循环中的变量。

以下是推荐的错误修正:

var i = 0,
len = that.users.length;

(function(i) {
  while(i < len) {
    console.log(' - - - - - debug - - - - -');
    console.log('i = ' + i );
    i++;
  }
})(i);

有人可以向我解释为什么使用匿名函数是必要的吗?

1 个答案:

答案 0 :(得分:1)

只有在循环中有异步代码时才会出现问题。例如(为简单起见,我改为for循环):

var i = 0,
len = that.users.length;

for(i = 0;i < len;i++) {
  setTimeout(function() {
    console.log('i = ' + i );
  }, 500);
}

您会发现运行此代码会导致len的值打印len次,而不是最多len。这是因为for循环在任何print语句运行之前完成,因此循环已退出,因为i == len

对此的修复是使用立即调用的函数表达式(IIFE)将i锁定到每个值:

var i = 0,
len = that.users.length;

for(i = 0;i < len;i++) {
  (function(i) {
    setTimeout(function() {
      console.log('i = ' + i );
    }, 500);
  })(i);
}

这不完全是你提出的错误修正,但它是我能想到的最接近的错误。鉴于更多的背景,我可以更加确定它应该解决的问题。