【问题标题】:Async function with for of loop and await inside, will it wait?带有 for of 循环和内部等待的异步函数,它会等待吗?
【发布时间】:2021-04-07 20:51:54
【问题描述】:

我对 javascript 中带有循环的异步等待有点困惑。我创建了以下代码,其中包含三个数据库查询。但我不确定第三个查询(“deleteData”)是否总是等待 for of 循环在步骤 2 中完成?换句话说,第 2 步中的 for of 循环总是会在异步函数中的下一行执行之前完成吗?如果没有,我应该如何编写循环?

async function run() {
    //1. Select Data from table "userData"
    const selectData = await promisePool.execute(
        "SELECT user_id, firstname, lastname FROM userData WHERE user_id = (?)", 
        [1]
    )
    const parseData = JSON.parse(JSON.stringify(selectData))
    const selectedData = parseData[0]

    // 2. Insert each of the selected data with a loop to another table ("backupTable")
    for (const el of selectedData) {
        const backup = await promisePool.execute(
            "INSERT INTO backupTable (user_id, firstname, lastname) VALUES (?,?,?) ON DUPLICATE KEY UPDATE firstname=(?)",
            [el.user_id, el.firstname, el.lastname, el.firstname]
        )
    }

    // 3. Delete the data from table "userData"
    const deleteData = await promisePool.execute(
        "DELETE FROM userData WHERE users_companyID = (?)",
        [1]
    )
}
run();

【问题讨论】:

  • 你试过了吗?
  • (剧透:它有效)
  • 我已经尝试过了,它似乎可以工作,但我想确保它即使在循环中有更大的数据时也能工作,我也想学习正确的方法。但如果你说这是正确的,那就太好了!
  • 是的,它会的,for of 没有任何惊喜。但是如果你使用 .forEach 和 async 函数,你会发现它不会等待
  • 好的,所以等待 for 循环而不是 forEach?这是很好的信息。将对此进行更多调查

标签: javascript async-await


【解决方案1】:

是的。它会等待。看看下面的例子。

// START OF DELAYED RESPONSE SIMULATION BLOCK
function calSqr(val) {
  console.log(`@calSqr val=${val}`);
  // 2 seconds delay
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(val*val)
    }, 2000)
  });
}
// END OF DELAYED RESPONSE SIMULATION BLOCK

async function printNumbers() {
  for(const val of [1, 2, 3, 4, 5]) {
    console.log(`@printNumbers calling getNum(${val})`);
    let res = await calSqr(val);
    console.log(`@printNumbers res=${res}`);
    console.log('----------');
  }
}

printNumbers();

注意:使用 forEach 的 async/await 不会等待 (Read More)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多