调用async异步函数返回Promise<pending>如何获取resolve后的结果
问题原因
所有async标记的函数返回值本身就是Promise实例,你调用时未添加await关键字,所以直接拿到了处于pending状态的Promise对象,而非resolve后的执行结果。
另外你的辅助函数存在隐藏bug:map遍历的异步回调中没有返回查询结果,最终Promise.all拿到的结果都会是undefined。
修正代码
1. 修正辅助函数
const getFeedPhotos = async (followingArr) => { const promises = followingArr.map(async userId => { // 补充return,返回查询到的图片结果 return Photo.find({userId: mongoose.Types.ObjectId(userId)}); }); return Promise.all(promises); };
2. 修正路由调用逻辑
photoRouter.get( '/feed', expressAsyncHandler(async (req, res) => { const following = req.body.following; if (following) { // 添加await等待异步执行完成,拿到resolve后的结果 const response = await getFeedPhotos(following); console.log(response); // 可选:如果需要把所有用户的图片合并为一维数组,使用flat()处理 // const allPhotos = response.flat(); // 返回结果给客户端 res.status(200).send(response); } else { res.status(400).send({ message: '"Following" is not provided.' }) } }) );
额外注意事项
- 按照HTTP规范,GET请求通常不携带请求体,部分代理、客户端会默认丢弃GET请求的body,建议将该接口改为POST请求,或者将following参数放到URL查询参数中传递。
Promise.all会并行执行所有查询请求,如果你的关注列表非常长,可能需要考虑添加并发限制,避免数据库请求压力过大。
内容的提问来源于stack exchange,提问作者ArtemNovikov
相关产品推荐
相关产品推荐

