Promises are objects that represent the eventual completion or failure of an asynchronous operation. They provide a way to handle asynchronous
operations in a more organized and manageable manner. To use await
, you need to ensure that you are calling a function or an expression
that returns a promise.
The reason await
should only be used on a promise is that it expects the operand to be a promise object. When you use
await
, it waits for the promise to be resolved or rejected and then returns the resolved value or throws the rejection reason,
respectively. If the operand of await
is not a promise, awaiting it is redundant and might not have been the developer’s intent.
If you try to use await
on a non-promise value, such as a regular object or a primitive type, it will not pause the execution of the
function because there is no asynchronous behavior involved. Instead, await
will convert the value to a resolved promise, and waits for
it.
const x = 42;
await x; // Noncompliant: x is a number, not a promise
You should only use await
on promises because it is designed to handle asynchronous operations and works in conjunction with the
Promise API to provide a clean and intuitive way to write asynchronous code in JavaScript.
const x = Promise.resolve(42);
await x;
When calling a function that returns a promise as the last expression, you might forget to return it, especially if you refactored your code from a
single-expression arrow function.
function foo() {
Promise.resolve(42);
}
async function bar() {
await foo(); // Noncompliant
}
Make sure that you return the promise.
function foo() {
return Promise.resolve(42);
}
async function bar() {
await foo(); // Compliant
}
Exceptions
The rule does not raise issues if you are awaiting a function whose definition contains JSdoc with @returns
or @return
tags. This is due to JSdoc often mistakenly declaring a returning type without mentioning that it is resolved by a promise. For example:
async function foo () {
await bar(); // Compliant
}
/**
* @return {number}
*/
async function bar () {
return 42;
}