disallow using an async function as a Promise executor (no-async-promise-executor)

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:

Rule Details

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);

When Not To Use It

If your codebase doesn’t support async function syntax, there’s no need to enable this rule.

Version

This rule was introduced in ESLint 5.3.0.

Resources