no-async-promise-executor

禁止使用异步函数作为 Promise 执行器

配置文件 中的 "extends": "eslint:recommended" 属性启用了该规则

new Promise 构造函数接受一个执行器函数作为参数,该函数具有 resolvereject 参数,可用于控制创建的 Promise 的状态。例如:

const result = new Promise(function executor(resolve, reject) {
  readFile('foo.txt', function(err, result) {
    if (err) {
      reject(err);
    } else {
      resolve(result);
    }
  });
});

执行器函数也可以是 async function。但是,这通常是一个错误,原因如下:

  • 如果异步执行器函数抛出错误,错误将丢失,不会导致新构建的 Promise 拒绝。这可能会使调试和处理一些错误变得困难。
  • 如果 Promise 执行器函数使用 await,这通常表明实际上不需要使用 new Promise 构造函数,或者可以缩小 new Promise 构造函数的范围。

规则详情

SY1Cw9olnr4DNc2X1cu/TbmH4XcIp4OkUnn/GWAn4WgGoJk6SBN5oqioxwffSGiMc/UlwHEofMiZP1Rgzhin4g==

gNC8k1GhM1l+ifT0oB5hn+zXriUeOlJvzNWbAdkHCTa4VYZM8AfDV85WH1+S90i1

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

i8fBrbWlOixNpv1HSm4U+JHkcyHZXv/5F9Nee4yHLmfeW3M9MemjU5R1ZOmIoGOM

const foo = new Promise((resolve, reject) => {
  readFile('foo.txt', function(err, result) {
    if (err) {
      reject(err);
    } else {
      resolve(result);
    }
  });
});

const result = Promise.resolve(foo);

何时不使用

Rswhb8BcpIPfaGnNIxSkUQpX0Mff69br//ovtktjO+miInWmh3zrgneIl4uYrvI2nRQN55BS1TBWn3eGnpiaer/dM1m+O1MQhecGGmnezyU=