无await的async函数声明有何作用?两类返回Promise函数差异解析
两段返回Promise的函数的核心区别
虽然用await调用这两段代码时,正常情况下拿到的结果看起来一致,但它们在错误处理和内部执行逻辑上有本质区别:
1. 同步错误的处理差异
代码片段1(async函数):
作为async函数,它会自动捕获函数内部所有同步错误,并将其转换成状态为rejected的Promise。比如如果getAllPages未定义、参数校验抛出同步错误,这些问题不会直接向外抛出,而是被包装成Promise的拒绝态,后续用await调用时,能通过try/catch统一捕获处理。代码:
export async function getTags( tagTypeId: number ): Promise<Tags[]> { return getAllPages('/tags.json', { tagTypeId }); }代码片段2(普通函数):
普通函数没有自动捕获同步错误的能力,如果函数内部发生同步异常(比如getAllPages未定义),会直接抛出同步错误,而非转为Promise拒绝态。这时候用await调用时,必须单独处理这类同步异常(额外的try/catch),否则会直接中断程序执行。代码:
export function getTags( tagTypeId: number ): Promise<Tags[]> { return getAllPages('/tags.json', { tagTypeId }); }
2. 返回值的包装逻辑
async函数的特性是:无论返回什么值,都会被自动包装成Promise。如果返回的本身就是Promise,async会直接返回这个Promise(不会额外嵌套),所以正常调用结果一致。但如果后续修改函数逻辑,比如直接返回非Promise值(如数组),片段1会自动将其转为Promise,而片段2会因不符合返回类型标注报错(TypeScript环境),或导致调用方的await失效(JS环境)。
调用示例
const tags = await getTags(tag.typeId);
内容的提问来源于stack exchange,提问作者JakubJ
相关产品推荐
相关产品推荐

