Node.js异步函数返回空数组问题:控制器与模型结果不一致
问题根源
你遇到的问题是异步操作未等待完成就返回结果:pollOptions.rows.map(async value => { ... }) 中的async函数会返回Promise,但map本身不会等待这些Promise执行完毕。你的代码直接返回了空的result数组,而result.push(data)是在后续异步操作完成后才执行的,这就导致控制器拿到的是提前返回的空数组,而模型里的console.log会在异步完成后打印出正确数据。
修复方案
有两种常用的修复方式:
方式1:用for...of循环替代map
for...of可以等待每个异步操作完成后再执行下一次循环,确保result数组被正确填充:
const getPollOptionsByPollId = async (poll_id) => { var querySql1 = "SELECT * FROM public.group_poll_options WHERE option_poll_id= $1 AND option_status = $2 ORDER BY option_id"; var queryParams1 = [poll_id, "active"]; var pollOptions = await db.query(querySql1, queryParams1); var result = []; if (pollOptions.rowCount != 0) { // 用for...of等待每个异步操作完成 for (const value of pollOptions.rows) { var voteCount = await totalvotesbypolloption(poll_id, value.option_id); console.log("voteCount",voteCount); var data = { option_id: value.option_id, option_poll_id: value.option_poll_id, option_value: value.option_value, option_status: value.option_status, option_created_at: value.option_created_at, option_votes: voteCount } result.push(data); } } return result; }
方式2:用Promise.all处理Promise数组
收集map返回的所有Promise,用Promise.all等待全部执行完成后再返回结果:
const getPollOptionsByPollId = async (poll_id) => { var querySql1 = "SELECT * FROM public.group_poll_options WHERE option_poll_id= $1 AND option_status = $2 ORDER BY option_id"; var queryParams1 = [poll_id, "active"]; var pollOptions = await db.query(querySql1, queryParams1); if (pollOptions.rowCount === 0) { return []; } // 等待所有异步操作完成后生成结果数组 const result = await Promise.all(pollOptions.rows.map(async value => { var voteCount = await totalvotesbypolloption(poll_id, value.option_id); console.log("voteCount",voteCount); return { option_id: value.option_id, option_poll_id: value.option_poll_id, option_value: value.option_value, option_status: value.option_status, option_created_at: value.option_created_at, option_votes: voteCount } })); return result; }
内容的提问来源于stack exchange,提问作者pankaj
相关产品推荐
相关产品推荐

