Skip to main content

noAsyncPromiseExecutor

Disallows using an async function as a Promise executor.

The executor function can also be an async function. However, this is usually a mistake, for a few reasons:

  1. If an async executor function throws an error, the error will be lost and won’t cause the newly-constructed Promise to reject. This could make it difficult to debug and handle some errors.
  2. If a Promise executor function is using 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.

Examples

Invalid

new Promise(async function foo(resolve, reject) {})
warning[noAsyncPromiseExecutor]: Promise executor functions should not be `async`.
   noAsyncPromiseExecutor.js:1:13
  
1  new Promise(async function foo(resolve, reject) {})
               --------------------------------------

  new Promise(async (resolve, reject) => {})
warning[noAsyncPromiseExecutor]: Promise executor functions should not be `async`.
   noAsyncPromiseExecutor.js:1:15
  
1    new Promise(async (resolve, reject) => {})
                 -----------------------------

  new Promise(((((async () => {})))))
warning[noAsyncPromiseExecutor]: Promise executor functions should not be `async`.
   noAsyncPromiseExecutor.js:1:19
  
1    new Promise(((((async () => {})))))
                     --------------

Valid

  new Promise((resolve, reject) => {})
new Promise((resolve, reject) => {}, async function unrelated() {})
new Foo(async (resolve, reject) => {})
new Foo((( (resolve, reject) => {} )))