javascript - 在 Promise 中将项目添加到数组时遇到问题
问题描述
我正在制作一个类似网站的社交媒体,用户可以在其中互相关注。在我的一条路线中,我想遍历当前用户关注的数组,这是一个 id 数组,找到这些用户的帖子并将它们添加到一个大数组中,然后按日期对帖子进行排序。问题是数组在帖子被添加到它之前被发送到客户端。不确定我是否需要某种异步功能或什么。
我的发帖路线
const express = require('express')
const user = require("../models/user')
const router = express.Router()
router.get("/api/:username/following/posts", (req, res) => {
let following = [...req.user.following, req.user._id]
let posts = [], i;
for(i = 0; i < following.length; i++){
User.findById(following[i]).populate("posts")
.then(user => {
for(let b = 0; b < user.posts.length; b++){
posts.push(user.posts[b])
}
})
.catch(err => {
console.log(err)
})
}
console.log(posts) // returns []
res.json(posts)
})
解决方案
使用异步/等待
router.get("/api/:username/following/posts", async (req, res) => {
const following = [...req.user.following, req.user._id]
const posts = [];
for(let f of following){
const user = await User.findById(f).populate("posts");
posts.push(...user.posts);
}
console.log(posts)
res.json(posts)
})
仅使用 Promise
router.get("/api/:username/following/posts", (req, res) => {
const following = [...req.user.following, req.user._id];
Promise.all(following.map(f => User.findBy(f).populate("posts")))
.then(users => {
const posts = users.map(({posts}) => posts).flat();
console.log(posts);
res.json(posts);
});
})
主要区别在于,只有 Promises 的代码会并行调用 User.findBy,而 async/await 会依次调用它们(不用担心,promises 版本中也会维护顺序)
如果并行调用 findBy 出现问题,并且您仍然不想使用 async/await,则可以这样做:
router.get("/api/:username/following/posts", (req, res) => {
const following = [...req.user.following, req.user._id];
Promise.all(following.reduce((p, f) => p.then(results => User.findBy(f).populate("posts").then(user => [...results, user])), Promise.resolve([])))
.then(users => {
const posts = users.map(({posts}) => posts).flat();
console.log(posts);
res.json(posts);
});
})
推荐阅读
- python - 为什么我的烧瓶应用程序不加载 CSS 文件?
- c++ - 后续 openMP 并行循环的性能
- javascript - 我在这段JS代码中使用了slice方法,我的代码很慢,有没有办法让这段代码更快?
- android - 如何将 FirebaseFirestore 与 Paging 3 库一起使用?
- pagespeed - 页面加载后运行 Zopim Chat 会影响页面速度
- python - SQL python连接问题
- excel - 根据选择中的索引增加行引用,并且工作表之间的行号不同
- regex - 请求参数使用 Spring Boot 应用程序的嵌入式码头服务器记录在访问日志中
- python-3.x - 替换脚本中不推荐使用的解析
- r - 删除热图图块之间的空间