Foreach应该等待下一次迭代,直到在节点中执行等待

时间:2019-12-03 12:09:49

标签: node.js async-await

我是节点js的新手,使用等待功能存在问题。 对于每个应等待下一次迭代,直到在节点中执行等待。 在下面的代码中,我总是将consumptionSummaryID设为0,但我希望数据库为案例REF的下一次迭代插入ID。

var consumptionSummaryID=0; 
transaction.otherSegments.forEach(async function(segment){
    switch (segment.segment) {
        case 'PTD': let ptdInsertRaw= await con.query('INSERT INTO `consumption-summary` SET ?', ptdInsert);
                    consumptionSummaryID= ptdInsertRaw.insertId;  

        case 'REF':
                    if(consumptionSummaryID!=0){
                      // having code related to consumptionSummaryID;
                    }
    }
});

请帮助。

预先感谢

1 个答案:

答案 0 :(得分:1)

如果使用for循环或for...of循环,则等待将按预期工作。在这种情况下,您不能使用foreach,因为它不会等待异步功能完成。

另外,请记住,您只能在异步函数中使用await。

在您的情况下,您可以做类似的事情

for(let segment of transaction.otherSegments) {
    switch (segment.segment) {
        case 'PTD': let ptdInsertRaw= await con.query('INSERT INTO `consumption-summary` SET ?', ptdInsert);
                    consumptionSummaryID= ptdInsertRaw.insertId;  

        case 'REF':
                    if(consumptionSummaryID!=0){
                      // having code related to consumptionSummaryID;
                    }
    }
}

这也可以:

for(let segmentIndex = 0; segmentIndex < transaction.otherSegments.length; segmentIndex++) {
    let segment = transaction.otherSegments[segment];
    switch (segment.segment) {
        case 'PTD': let ptdInsertRaw= await con.query('INSERT INTO `consumption-summary` SET ?', ptdInsert);
                    consumptionSummaryID= ptdInsertRaw.insertId;  

        case 'REF':
                    if(consumptionSummaryID!=0){
                      // having code related to consumptionSummaryID;
                    }
    }
}

下面是在for ..循环中使用await的基本示例:

// Mock function returning promise to illustrate for .. of and await.
function writeItemToDB(item) {
    return new Promise((resolve) => setTimeout(resolve, 1000));
}

async function testWait() {
  console.log("Writing items to db..");
  let items = [...Array(5).keys()];

  for(let item of items) {
      let result = await writeItemToDB(item);
      console.log("Wrote item "  + item + " to db..");
  }
  console.log("Done.");
}

testWait();