Sequelizer返回更新前存在的数据

时间:2018-12-05 03:34:53

标签: sequelize.js

我正在从循环中更新特定模型。它基本上将一个号码分配到多个记录中,直到号码消失为止。不过有时候,这个数字可能太多了,所以循环结束时还会剩下一些。现在,当发生这种情况时,我想将剩下的金额放入循环中更新的表之一中。

我正在获取要更新的确切记录,但是它的数量反映了循环中更新之前的数量,但是在数据库中它已正确更新。

我的console.log()显示运行时确实执行了正确的命令。每个订单首先在循环中执行,然后消失。

下面只是一个示例

  amount = 900
  ModelName=[{'current_balance':100,'id':1},{'current_balance':90,id:2}]; // Schema structure
  for(let i=0; i<2; i++){
   //update records
    console.log('updating row ' , i);
   const currentBalance= updateRecords[i]['current_balance']
   const newBalance= 30+ currentBalance 
   db.ModelName.update({balance:newBalance})

   amount= amount - 30;

  }

  // do we have amount left?
  if (amount >0){
    console.log('remain amount')
   // with Sequelizer SELECT, I am getting the latest record sucesssfully. After adding 30 to it in the looop, here its balance should have been 120. But I still get 90
  }

控制台输出为

  updating row 0
  updating row 1
  remain amount

并且在循环完成后数据库包含正确的信息,但是当我在循环结束时检查时,仍然看到循环之前的原始值。

1 个答案:

答案 0 :(得分:0)

问题:

for(let i=0; i<2; i++){
    //update records
    console.log('updating row ' , i);
    const currentBalance= updateRecords[i]['current_balance']
    const newBalance= 30+ currentBalance 
    db.ModelName.update({balance:newBalance}) // <---- ISSUE IS HERE
    amount= amount - 30;
}

您正在循环,但不等待更新完成,应该等待更新完成,然后转到下一个更新


解决方案:

如果您正在使用async/await,则应像这样使用它:

async function FUNCTION_NAME() { // <----- async should be here
    ...
    await db.ModelName.update({balance:newBalance}); // <----- await should be here
    ....
}

Promise.all

let promises = []; // <---- HERE
for(let i=0; i<2; i++){
    //update records
    console.log('updating row ' , i);
    const currentBalance= updateRecords[i]['current_balance']
    const newBalance= 30+ currentBalance 
    promises.push(db.ModelName.update({balance:newBalance})) // <---- HERE
    amount= amount - 30;
}

if (amount >0){
    Promise.all(promises).then(data => {
        console.log('remain amount'); // <---- CHECK HERE
    });
}