Disallow using an async function as a Promise executor
The "extends": "eslint:recommended"
property in a configuration file enables this rule
The new Promise
constructor accepts an executor function as an argument, which has resolve
and reject
parameters that can be used to control the state of the created Promise. For example:
const result = new Promise(function executor(resolve, reject) {
readFile('foo.txt', function(err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
The executor function can also be an async function
. However, this is usually a mistake, for a few reasons:
Promise
to reject. This could make it difficult to debug and handle some errors.await
, this is usually a sign that it is not actually necessary to use the new Promise
constructor, or the scope of the new Promise
constructor can be reduced.This rule aims to disallow async Promise executor functions.
Examples of incorrect code for this rule:
const foo = new Promise(async (resolve, reject) => {
readFile('foo.txt', function(err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
const result = new Promise(async (resolve, reject) => {
resolve(await foo);
});
Examples of correct code for this rule:
const foo = new Promise((resolve, reject) => {
readFile('foo.txt', function(err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
const result = Promise.resolve(foo);
If your codebase doesn’t support async function syntax, there’s no need to enable this rule.
This rule was introduced in ESLint v5.3.0.
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-async-promise-executor