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
相关产品推荐
相关产品推荐

