You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 04:57:21