Node.js中如何替代setTimeout,确保演员异步查询完成后返回电影数据?
解决方案
你可以用Promise.all批量处理所有演员信息的异步查询,确保所有请求完成后再替换演员ID列表并返回结果,同时结合async/await让代码逻辑更清晰,彻底替代不合理的setTimeout。
优化后的代码如下:
const getMovie = async (req, res) => { try { const movie = await Movie.findById(req.params.id); if (!movie) { return res.json('This movie does not exist'); } // 将所有演员ID的查询请求转为Promise数组,用Promise.all等待全部完成 const actors = await Promise.all( movie.Actors.map(actorId => Actor.findById(actorId)) ); // 替换演员ID列表为演员信息 movie.Actors = actors; res.json(movie); } catch (err) { res.status(400).json(`Error: ${err}`); } };
关键说明:
Promise.all的作用:movie.Actors.map会把每个演员ID转换成一个Actor.findById的Promise,Promise.all会等待这个数组里的所有Promise都成功resolve后,返回一个包含所有演员信息的数组,这样就能保证所有演员信息都查询完成后再继续执行后续代码。async/await简化异步逻辑:相比原来的then嵌套,用await可以让异步代码看起来像同步代码,逻辑更直观,也更容易处理错误。- 错误处理:整个逻辑包裹在
try/catch里,不管是查询电影出错,还是查询演员信息出错,都会统一进入catch块返回错误信息。 - 避免重复响应:在电影不存在的判断里用
return,防止后续代码继续执行导致重复发送响应。
内容的提问来源于stack exchange,提问作者Yousef Mohamed
相关产品推荐
相关产品推荐

