JavaScript / Binding index with Node.js



我有以下代码(dbclient是Node.js的Redis客户端(:

dbclient.zrange("cache", -1000000000000000, +1000000000000000, function(err, replies) {
  logger.info("Replies: " + replies.length);
  logger.info(err);
  for (var i = 0; i < replies.length; i++) {
    logger.info("I: " + i)
    dbclient.hmget("doc:" + replies[i], "size", function(err, res) {
    cache.set(replies[i], parseInt(res[0]));
      logger.info(res[0]);
    });
  }
});

我注意到一个奇怪的行为:

第一个输出是:Replies: 195748 ,但是在for循环中,我注意到它总是打印I: 195747并且res[0]总是198536。这运行了195747次。

它似乎卡在最后一个索引上,并且不会遍历所有项目。

这是 Javascript 中最常见的错误之一,在

function(err,res){
    cache.set(replies[i], parseInt(res[0]));
    logger.info(res[0])
}

您正在使用 i ,但这始终是父作用域中的那个。由于该函数作为异步回调运行,因此它始终是最后一次循环迭代的值。

将其更改为

(function(i) {
    return function(err,res){
        cache.set(replies[i], parseInt(res[0]));
        logger.info(res[0])
    };
})(i)

i绑定到最内层函数的作用域

进一步解释:循环中的JavaScript闭包 - 简单的实际示例

最新更新