For more tips like this, sign up to the weekly newsletter!
Scope async/await variables
In Promise chains, the then
functions properly scope the variables declared inside them. They are accessible inside the functions, but not outside.
For example, let's look into a simple chain:
Promise.resolve(10)
.then((num) => {
var plusone = num + 1;
return plusone;
})
.then((res) => {
console.log(res); // 11
});
The plusone
variable does not leak, it is only accessible inside the first then
function.
Contrast that with a straightforward rewrite to async/await:
var num = await Promise.resolve(10);
var plusone = num + 1;
console.log(plusone); // 11
// plusone is still accessible
The variable pollutes the scope and breaks the nice encapsulation property of the traditional approach.
Use async IIFE
To scope the variables, use an async IIFE and await for it:
await (async () => {
var num = await Promise.resolve(10);
var plusone = num + 1;
console.log(plusone); // 11
})();
// plusone is out of scope
This is the same approach that scopes var
s in a non-async context.
Use block-scoped variables
Alternatively, instead of using an IIFE, block-scoped variables (let
and const
) and a block also does the trick.
{
const num = await Promise.resolve(10);
const plusone = num + 1;
console.log(plusone); // 11
}
// plusone is out of scope