javascript"不要在循环中发挥作用"

时间:2015-03-27 11:33:12

标签: javascript

如何从JSLinter中删除我的代码以消除此错误? 我尝试将整个函数移到var中,但代码在之后无法运行。

  for (i = 0; i < timeDifference; i++) {
    timestamp ++;
    console.log(timestamp);
    energyDatum.find({timestamp: timestamp}).toArray(function(err, result) {
      var data = {};
      result.forEach(function(element) {
        data[element.deviceId] = element;
      });

      var roomRawData = [];
      mappings.forEach(function(room) {
        var hash = {};
        hash.floor = room.floor;
        hash.name = room.name;
        hash.room_type = room.room_type;
        hash.energy_ac = sumApplianceEnergy('energy_ac', room, data);
        hash.energy_light = sumApplianceEnergy('energy_light', room, data);
        hash.energy_socket_1 = sumApplianceEnergy('energy_socket_1', room, data);
        hash.energy_socket_2 = sumApplianceEnergy('energy_socket_2', room, data);
        hash.energy_socket_3 = sumApplianceEnergy('energy_socket_3', room, data);
        hash.energy_total = hash.energy_ac + hash.energy_light + hash.energy_socket_1 + hash.energy_socket_2 + hash.energy_socket_3;
        hash.timestamp = timestamp;
        roomRawData.push(hash);
      });

      roomRaw.insert(roomRawData, {w:1}, function(err, result) { console.log('done'); });

    });

    lastTimestamp.update({_id: timestampId}, {timestamp: timestamp});
  }

1 个答案:

答案 0 :(得分:1)

JSLinter显示此消息,因为您的代码存在潜在错误。

看看这一行:

energyDatum.find({timestamp: timestamp}).toArray(...);

这种方法是异步的,对吧?这意味着toArray方法的回调 在 之后被称为 for循环完成其迭代,因此timestamp 变量(当你在这个回调中使用它时)没有当前迭代的值, 但它的值增加了timeDifference次。

要解决此问题,您可以将此回调移动到另一个函数:

var getIterationFunc = function(timestamp) {
    return function(err, result) {
        var data = {};
        // rest of function ...         
    }
}

然后使用它:

energyDatum.find({timestamp: timestamp}).toArray(getIterationFunc(timestamp));

我认为现在应该修复此错误。希望这会有所帮助。

P.S。抱歉我的英文