Skip to content
← Back to rules

eslint/no-async-promise-executor 正确性

This rule is turned on by default.

它做了什么

禁止将异步函数用作 Promise 执行器。

为什么这是不好的?

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

javascript
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,这通常表明实际上并不需要使用新的 Promise 构造函数,或者新 Promise 构造函数的作用域可以缩小。

示例

此规则的 错误 代码示例:

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

此规则的 正确 代码示例:

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

const result = Promise.resolve(foo);

如何使用

要通过配置文件或 CLI 启用 此规则,可以使用:

json
{
  "rules": {
    "no-async-promise-executor": "error"
  }
}
bash
oxlint --deny no-async-promise-executor

参考资料