Мне трудно разобраться в асинхронном поведении вложенных forEach()
функций с помощью node.js
. Я не уверен, где мне следует создать и вернуть обещание и т. Д.
Я попытался обернуть всю логику функции getFeed()
в return new Promise()
, но я думаю, что решение вызывается до того, как вложенные forEach()
будут выполнены.
friends = user_info.friends;
function GetFeed() {
let post_ids = [];
try {
friends.forEach(async function(friend_id) {
const posts = await db.collection('users').findOne(
{ _id: ObjectId(friend_id) },
{ projection: { posts: 1 }}
);
posts.posts.forEach(function(post_id) {
console.log(post_id);
post_ids.push(post_id);
});
});
return new Promise((resolve, reject) => {
resolve(post_ids);
});
} catch (err) {
return res.status(500).json({ error: 'Internal server error, unable to collection post ids from the database.' });
}
}
GetFeed()
.then((post_ids) => {
console.log(post_ids);
return res.status(200).json({ post_ids: post_ids });
})
операторы console.log () показывают, что GetFeed().then()
выполняется перед оператором console.log()
во внутреннем цикле forEach
. Я ожидаю, что GetFeed().then()
console.log будет ожидать завершения работы логики nest forEach
, а затем console.log с результатом.