异步等待-等待是否阻止其他代码运行?
在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")
}