AWS SDK v2转v3:TypeScript异步分页函数为何需返回Promise?
关于Async函数返回Promise的疑问与代码修正
核心原因:Async函数的本质就是返回Promise
不管你在async函数内部返回什么值(原始值、数组、对象等),JavaScript引擎都会自动把这个返回值包装成一个resolved状态的Promise。这是async语法糖的既定规则,和你是否使用await无关——只要函数被标记为async,它的返回类型就必然是Promise。
你觉得自己返回的是字符串数组,但实际上return tableNames这句代码会被JS自动处理成return Promise.resolve(tableNames),所以TypeScript要求你把函数返回类型声明为Promise<string[]>,而不是直接的string[]。
不需要手动返回new Promise
async语法糖已经帮你完成了Promise的包装工作,完全不需要手动调用new Promise()。你只需要正确声明函数的返回类型,或者让TypeScript自动推断类型即可。
修正后的代码
import { DynamoDBClient, paginateListTables, } from "@aws-sdk/client-dynamodb"; // 明确声明返回类型为Promise<string[]> async function getTableNames(): Promise<string[]> { const paginatorConfig = { client: new DynamoDBClient({}), pageSize: 25 }; const commandParams = {}; const paginator = paginateListTables(paginatorConfig, commandParams); const tableNames: string[] = []; // 异步迭代分页结果 for await (const page of paginator) { // 处理TableNames可能为undefined的情况 tableNames.push(...(page.TableNames || [])); } // 返回的数组会被自动包装为Promise return tableNames; } async function doSomething() { // 使用await解析Promise,拿到实际的字符串数组 const tableNames = await getTableNames(); console.log(tableNames); }
补充说明
for await...of是异步迭代器语法,内部会等待每一页的异步请求完成,所以函数必须标记为async,这进一步决定了函数返回Promise。- 调用
getTableNames()时,必须用await(或者.then())来获取内部的数组值,这也是你在doSomething里已经做的正确操作。
内容的提问来源于stack exchange,提问作者sartoz
相关产品推荐
相关产品推荐

