如何使setTimeout顺序进行多个数据库更新?

问题描述

我正在使用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);
}