Async and Await
The async and await keywords in JavaScript are used to make asynchronous programming easy,
by introducing something called coroutines. A coroutine is a function which can pause
its execution and return control to the main loop until some event occurs. It is an alternative
approach for using callback functions, which makes it easier to write, understand and maintain.
The await keyword
The await keyword is a special command which tells JavaScript to stop the execution of the
current function until a Promise resolves, and then return the promise's value. It can be
seen as an endless loop which checks if the promise has been resolved, and returns the value
of the resolved promise when it does.
The await keyword only works inside async functions (which are coroutines, as explained before).
The tricky part about async functions is that they return a Promise, instead of a value. This
means that every time we need to run an async function, we need to await on it if we want
to get the return value.
Let's revisit the example of sumAsync from the Promises tutorial, but with using the sleep
function instead of setTimeout, so we can implement sumAsync using await later on.
The sleep function will return a Promise which resolves after ms milliseconds, and uses
setTimeout to work.
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function sumAsync(x, y) {
return new Promise((resolve, reject) => {
sleep(500).then(() => {
resolve(x + y);
});
});
}
// let's use the function now
sumAsync(5, 7).then((result) => {
console.log("The result of the addition is:", result);
});
We can make our code sumAsync much nicer by simply using await on the sleep function and then
returning the result.
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function sumAsync(x, y) {
// this code waits here for 500 milliseconds
await sleep(500);
// done waiting. let's calculate and return the value
return x+y;
}
// sumAsync is an async function, which means it returns a Promise.
sumAsync(5, 7).then((result) => {
console.log("The result of the addition is:", result);
});
Since sumAsync is a an async function, it implicitly returns a Promise, just like
the previous example which explicitly returns a Promise. The two sumAsync functions
are completely identical in their functionality, but the one which is defined using async
is much easier to understand!
Exercise
Write an async function which waits 500 milliseconds and then returns the uppercase
of a given string. Use the sleep function provided.