JavaScript中Promise.all()用法是否正确?附Node.js博客应用代码
你的Promise.all使用分析与优化方案
一、当前Promise.all的使用是否正确?
逻辑上是正确的——你通过Promise.all并行执行了所有删除用户创建博客、移除用户点赞记录的异步操作,确保这些操作都完成后再删除用户本身。但代码里存在冗余写法:
在map中使用async/await完全没必要,因为Blog.findByIdAndDelete(blog._id)和blog.removeUser(user)本身就返回Promise,直接返回这些Promise即可,map会自动将它们收集为Promise数组。比如原代码里的:
const createdBlogsPromises = createdBlogs.map(async blog => await Blog.findByIdAndDelete(blog._id));
可以简化为:
const createdBlogsPromises = createdBlogs.map(blog => Blog.findByIdAndDelete(blog._id));
冗余的async/await不会影响功能,但会额外生成一层Promise,属于不必要的开销。
二、更简便高效的替代方案
你的当前实现需要先查询所有目标博客,再逐个执行操作,多了两次数据库查询+N次单文档操作,效率较低。可以直接用MongoDB的批量操作API来简化流程,减少数据库请求次数:
优化后的代码
const user = req.user; // 1. 批量删除用户创建的所有博客 const deleteCreatedBlogs = Blog.deleteMany({ creator: user._id }); // 2. 批量移除用户在所有点赞博客中的记录 const removeLikes = Blog.updateMany( { likes: user._id }, { $pull: { likes: user._id } } ); // 并行执行两个批量操作 await Promise.all([deleteCreatedBlogs, removeLikes]); // 删除用户本身 await User.deleteOne({ _id: user._id }); res.status(204).json({ message: 'Successfully deleted!!' });
优化点说明
- 用
deleteMany替代“先find再逐个delete”:一次数据库操作完成所有用户创建博客的删除,避免多次请求。 - 用
updateMany + $pull替代“先find再调用实例方法”:利用MongoDB的数组更新操作符$pull,一次批量更新就能把用户ID从所有点赞博客的likes数组中移除,无需遍历处理每个文档。 - 代码更简洁,同时大幅减少数据库交互次数,性能更优。
内容的提问来源于stack exchange,提问作者shubham karande
相关产品推荐
相关产品推荐

