问题描述
我正在使用setTimeout()更新数据库字段。因此,当更新为多个时,会发生最后一个主键用于所有更新的情况。如何依次运行setTimeout()函数。下面是执行此操作的部分代码。
for( var i = 0; i < req.body.devicelist.length; i++) { //running for loop for multiple elements
var data = JSONPARSE.toObject(req.body);
mac_id = req.body.devicelist[i];
data.mac_id = mac_id;
var gateway_config;
for (let j = 0; j < gateways_config.length; j++) { //code for fetching specific element. IGnorE
if(gateways_config[j].latest_config.mac_id == mac_id){
gateway_config = gateways_config[j]
break;
}
gateway_config = undefined
}
await syncConfig(req.body,gateway_config,req.decoded.id);
..........
..........
}
syncConfig(body,gateway,user_id){
var jsonObj = body;
...
...
...
config_timeout_array[jsonObj.mac_id] = setTimeout(() => { //Causing problem
commandTimeout(jsonObj.org_id,jsonObj.mac_id)
},10000);
...
...
}
commandTimeout:(org_id,mac_id) =>{
console.log(mac_id); //prints same mac_id (the last in the array)
return gateway_model.findOneAndUpdate({ org_id: org_id,mac_id: mac_id },{ 'sync_sent': false },{"new": true})
.then((updated_gateway) => {
...
...
...
}
}
解决方法
config_timeout_array[jsonObj.mac_id] = setTimeout(() => { //Causing problem
commandTimeout(jsonObj.org_id,jsonObj.mac_id)
},10000);
而不是直接执行上述逻辑,而是调用一个函数并在那里执行。我不知道为什么,但是有效!
seqTimeout(jsonObj.org_id,jsonObj.mac_id); //function call
seqTimeout(org_id,mac_id){
config_timeout_array[mac_id] = setTimeout(() => {
GatewayController.commandTimeout(org_id,mac_id);
},COMMAND_TIMEOUT);
}