gpt4 book ai didi

javascript "don' t 在循环中创建函数”

转载 作者:行者123 更新时间:2023-12-03 10:28:55 27 4
gpt4 key购买 nike

如何重构我的代码以消除 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});
}

最佳答案

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));

我相信这个错误现在应该得到修复。希望这会有所帮助。

附注对不起我的英语

关于javascript "don' t 在循环中创建函数”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29299725/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com