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

为何async/await场景下map返回Pending Promise数组?如何修复?

问题解决:Pending Promise 而非解析结果的原因及修复

你的问题出在Array.map中使用了async回调函数——async函数本身会返回Promise,所以classInfo.rows.map(async entry => {...})返回的是一个由Promise组成的数组,而非直接得到处理后的结果。要等待所有Promise完成并获取解析后的值,需要用Promise.all()配合await。

另外还有一个小问题:你用数组assignmentMarks来存储字符串键的属性,这不符合数组的设计初衷(数组索引应为数字),建议改用普通对象来存储键值对。

修改后的代码

const getClassSummary = async (classID) => {
    const sqlText = `SELECT * FROM "public".${classID} LEFT JOIN "public"."students" ON "public".${classID}."students" = "public"."students"."id"`;
    const classInfo = await pool.query(sqlText);

    // 用Promise.all等待所有map里的async操作完成
    let marksData = await Promise.all(classInfo.rows.map(async (entry) => {
      // 改用对象存储键值对,而非数组
      let assignmentMarks = {};
      if (entry.assignments) {
        assignmentMarks[entry.assignments] = [];

        let marks = await getAssignmentMarks(classID, entry.assignments);
        // 用filter+map简化分数筛选逻辑
        assignmentMarks[entry.assignments] = marks
          .filter(datum => datum.score)
          .map(datum => datum.score);
      }
      return assignmentMarks;
    }));

    console.log(marksData); // 现在输出的是解析后的结果数组
    return { classInfo: classInfo.rows, marksData }; // 可按需返回marksData
};

关键修复点

  • await Promise.all(...):包裹map返回的Promise数组,等待所有异步操作完成,得到最终的结果数组。
  • 替换数组为对象:assignmentMarks从数组改为对象,避免用字符串作为数组索引的不合理用法。
  • 简化逻辑:用filter筛选出有分数的项,再用map提取分数,替代原有的forEach循环,代码更简洁可读。

内容的提问来源于stack exchange,提问作者filroy-codes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:05:30