异步等待-等待是否阻止其他代码运行?

在javascript中,等待块代码吗?例如,假设我们有以下代码:

async function queryDB() {
    const addUser = await promisePool.execute("INSERT INTO Users (User) VALUES ('username')")
    const selectUser = await promisePool.execute("SELECT User FROM Users") 
}

“selectUser”是否会等到 addUser 完成后才运行,以便我们可以选择添加的用户?

另外,假设我们在等待之间添加了一些不是承诺的代码,如下所示:

    async function queryDB() {
        const addUser = await promisePool.execute("INSERT INTO Users (User) VALUES ('username')")

setTimeout(() => console.log('Do something that takes 3 seconds'), 3000);

        const selectUser = await promisePool.execute("SELECT User FROM Users") 
    }

“selectUser”会等待 addUser 而不是 setTimeout 吗?如果是这样,你将如何编写上面的代码让 addUser 先运行,然后 setTimeout 然后 selectUser?

我还想补充一点,我一直在研究和阅读 stackoverflow 和其他资源,但我需要澄清一下。

回答

“selectUser”是否会等到 addUser 完成后才运行,以便我们可以选择添加的用户?

MDN Docs - await:

await 表达式会导致异步函数执行暂停,直到 Promise 被解决(即完成或拒绝),并在完成后恢复异步函数的执行。恢复时, await 表达式的值是已完成的 Promise 的值。

queryDB函数的执行将在等待第一个 promise 完成时暂停。第二行代码只有在第一行成功完成后才会执行。

“selectUser”会等待 addUser 而不是 setTimeout 吗?

对,那是正确的。

如果是这样,你将如何编写上面的代码让 addUser 先运行,然后 setTimeout 然后 selectUser?

您可以包装setTimeout一个返回承诺的函数,然后等待该承诺以确保在前两行完成后执行最后一行。

以下是包装函数的示例 setTimeout

function waitForTimeout(seconds) {
  return new Promise((resolve, reject) => {
     setTimeout(() => { 
        console.log("Hello World");
        resolve();
     }, seconds * 1000);        
  });
}

一旦你有了一个包装函数,你就可以await如下所示:

async function queryDB() {
    const addUser = await promisePool.execute(
        "INSERT INTO Users (User) VALUES ('username')"
    );

    await waitForTimeout(3);    // wait for 3 seconds

    const selectUser = await promisePool.execute("SELECT User FROM Users") 
}


以上是异步等待-等待是否阻止其他代码运行?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>