Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Async await - does await block other code from running?

In javascript, does await block code? For example, let's say we have the below code:

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

Will "selectUser" wait to run until addUser is finished so that we can select the user that is added?

Also, let's say that we add some code between the awaits that is not a promise, something like this:

    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") 
    }

Will "selectUser" wait for addUser but not the setTimeout? If so, how would you write the above code to make addUser run first, then setTimeout and then selectUser?

I would also like to add that I have been studying and reading on both stackoverflow and other resources, but I need some clarification.

like image 504
Hejhejhej123 Avatar asked Mar 02 '23 19:03

Hejhejhej123


1 Answers

Will "selectUser" wait to run until addUser is finished so that we can select the user that is added?

From MDN Docs - await:

The await expression causes async function execution to pause until a Promise is settled (that is, fulfilled or rejected), and to resume execution of the async function after fulfillment. When resumed, the value of the await expression is that of the fulfilled Promise.

Execution of queryDB function will be paused while it waits for the first promise to settle. Second line of code will only execute after first one has completed successfully.

Will "selectUser" wait for addUser but not the setTimeout?

Yes, that is correct.

If so, how would you write the above code to make addUser run first, then setTimeout and then selectUser?

You could wrap setTimeout in a function that returns a promise and then await that promise to make sure last line executes after first two have completed.

Following is an example of a wrapper function that wraps setTimeout

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

Once you have a wrapper function, you can await it as shown below:

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") 
}
like image 114
Yousaf Avatar answered Mar 05 '23 16:03

Yousaf