eslint/no-async-promise-executor 正确性
它做了什么
禁止将异步函数用作 Promise 执行器。
为什么这是不好的?
new Promise 构造函数接受一个执行器函数作为参数,该函数具有 resolve 和 reject 参数,可用于控制创建的 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