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

Async函数返回Promise { <pending> }而非正常值的原因及修复方案

问题原因
  • Array.map传入异步async函数时,每个迭代的返回值都是Promise对象,因此paymentsResults和pendingResults本质为Promise数组,而非实际的业务结果数组。
  • 控制台打印可正常展示数据,是因为运行环境的控制台会自动跟踪并展示已resolve的Promise内部值,但直接返回时这些Promise尚未执行完成,因此后端得到的是pending状态的Promise。
修复方案

使用Promise.all包裹两个异步map返回的Promise数组,等待所有异步任务执行完成后再返回结果,修改后的代码如下:

const query = await pool.query(q);

const payments = query.rows.filter(o => getCategory(o) === "payment");
const pending = query.rows.filter(o => getCategory(o) === "pending");
const inactive = query.rows.filter(o => getCategory(o) === "inactive");

// 新增await Promise.all等待所有异步操作完成
const paymentsResults = await Promise.all(payments.map(async order => {
    const A = ({
        date: getDate(order),
        item: await getItem(order),
        total: getTotal(order),
        purchaser: getPurchaser(order),
        email: getEmail(order),
        paymentMethod: getPaidUsing(order),
        status: getStatus(order)
    });
    return A;
}));

// 同样新增await Promise.all
const pendingResults = await Promise.all(pending.map(async order => {
    const B = {
        date: getDate(order),
        item: await getItem(order),
        total: getTotal(order),
        purchaser: getPurchaser(order),
        email: getEmail(order),
        status: getStatus(order)
    };
    return B;
}));

return {
    payments: paymentsResults,
    pending: pendingResults,
    inactive: inactive
};

如果需要避免单个getItem调用失败导致整个结果返回异常,可以将Promise.all替换为Promise.allSettled,后续自行过滤成功/失败的请求结果即可。

内容的提问来源于stack exchange,提问作者mark smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:36:03