Promise 函数异步
要求任何返回 Promise 的函数或方法标记为 async。
此规则报告的一些问题可以通过 --fix
ESLint 命令行选项 自动修复。
此规则需要 类型信息 才能运行。
确保每个函数只能
- 返回一个被拒绝的 promise,或者
- 抛出一个 Error 对象。
相反,非 async
、返回 Promise
的函数在技术上可以同时做到这两点。处理这些函数结果的代码通常需要处理这两种情况,这可能会变得很复杂。此规则的做法消除了创建代码来处理这两种情况的必要性。
当函数隐式地返回
Promise
和非Promise
类型的联合时,通常是一个错误——此规则会标记这些情况。如果这是故意的,请明确返回类型以允许规则通过。
module.exports = {
"rules": {
"@typescript-eslint/promise-function-async": "error"
}
};
在游乐场中尝试此规则 ↗
示例
此规则的代码示例
- ❌ 错误
- ✅ 正确
const arrowFunctionReturnsPromise = () => Promise.resolve('value');
function functionReturnsPromise() {
return Promise.resolve('value');
}
function functionReturnsUnionWithPromiseImplicitly(p: boolean) {
return p ? 'value' : Promise.resolve('value');
}
在游乐场中打开const arrowFunctionReturnsPromise = async () => Promise.resolve('value');
async function functionReturnsPromise() {
return Promise.resolve('value');
}
// An explicit return type that is not Promise means this function cannot be made async, so it is ignored by the rule
function functionReturnsUnionWithPromiseExplicitly(
p: boolean,
): string | Promise<string> {
return p ? 'value' : Promise.resolve('value');
}
async function functionReturnsUnionWithPromiseImplicitly(p: boolean) {
return p ? 'value' : Promise.resolve('value');
}
在游乐场中打开选项
此规则接受以下选项
type Options = [
{
/** Whether to consider `any` and `unknown` to be Promises. */
allowAny?: boolean;
/** Any extra names of classes or interfaces to be considered Promises. */
allowedPromiseNames?: string[];
checkArrowFunctions?: boolean;
checkFunctionDeclarations?: boolean;
checkFunctionExpressions?: boolean;
checkMethodDeclarations?: boolean;
},
];
const defaultOptions: Options = [
{
allowAny: true,
allowedPromiseNames: [],
checkArrowFunctions: true,
checkFunctionDeclarations: true,
checkFunctionExpressions: true,
checkMethodDeclarations: true,
},
];
allowAny
是否忽略返回 any
和 unknown
的函数。如果您想要额外的安全性,请考虑关闭此选项,因为它会降低规则捕获不正确 Promise 行为的能力。
带有 { "allowAny": false }
的代码示例
- ❌ 错误
- ✅ 正确
allowedPromiseNames
对于使用除全局内置 Promise
之外的构造来进行异步代码的项目。此选项允许指定导致函数也被检查的类或接口的字符串名称。
带有 { "allowedPromiseNames": ["Bluebird"] }
的代码示例
- ❌ 错误
- ✅ 正确
checkArrowFunctions
是否检查箭头函数。默认情况下为 true
,但可以设置为 false
以忽略它们。
checkFunctionDeclarations
是否检查独立函数声明。默认情况下为 true
,但可以设置为 false
以忽略它们。
checkFunctionExpressions
是否检查内联函数表达式。默认情况下为 true
,但可以设置为 false
以忽略它们。
checkMethodDeclarations
是否检查类和对象字面量上的方法,默认情况下为 true
,但可以设置为 false
以忽略它们。
何时不使用它
此规则可能难以在使用始终需要函数为 async
的 API 的项目中启用。您可能考虑使用 ESLint 禁用注释 以及为这些特定情况在您的依赖项上提交问题,而不是完全禁用此规则。
类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查规则后遇到性能下降,请参阅 性能故障排除。