Использование async / await
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)
})
с использованием только Promises
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 будет вызывать их по очереди (не волнуйтесь, порядок поддерживается и в обещанной версии)
Если есть проблема с параллельным вызовом findBy и вы все еще не хотите использовать async / подождите, вы можете сделать это как:
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);
});
})