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

