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

如何使用

To enable this rule using the config file or in the CLI, you can use:

json
{
  "rules": {
    "no-async-promise-executor": "error"
  }
}
ts
import { defineConfig } from "oxlint";

export default defineConfig({
  rules: {
    "no-async-promise-executor": "error",
  },
});
bash
oxlint --deny no-async-promise-executor

版本

此规则于 v0.0.3 中添加。

参考资料