我是节点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;
}
}
});
请帮助。
预先感谢
答案 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();