Javascript 在foreach循环中调用异步函数,循环完成后返回数组
我试图从foreach循环中的API请求数据,并将该数据推送到一个数组,然后在最后返回该数组。这是我的密码:Javascript 在foreach循环中调用异步函数,循环完成后返回数组,javascript,asynchronous,foreach,google-cloud-firestore,promise,Javascript,Asynchronous,Foreach,Google Cloud Firestore,Promise,我试图从foreach循环中的API请求数据,并将该数据推送到一个数组,然后在最后返回该数组。这是我的密码: db .collection('posts') .orderBy('createdAt', 'desc') .limit(10) .get() .then((data) => { let posts = [];
db
.collection('posts')
.orderBy('createdAt', 'desc')
.limit(10)
.get()
.then((data) => {
let posts = [];
data.forEach((doc) => {
db
.doc(`/users/${doc.data().userHandle}`)
.get()
.then((userDoc) => {
posts.push({
postId: doc.data().id,
userHandle: doc.data().userHandle,
userImageUrl: userDoc.data().imageUrl,
imageUrl: doc.data().imageUrl,
});
})
})
return res.json(posts);
})
.catch((err) => {
console.error(err);
res.status(500).json({ error: err.code});
});
由此,posts数组返回空数组或对象,即使我将return res.json(posts)替换为
任何帮助都是很棒的 该数组为空,因为在发送响应时,带有POST的承诺仍有待解决 为了解决此问题,您可以使用
.map()
收集数组中的所有承诺,等待它们在Promise.all()
的帮助下解决,然后发送响应:
db
.collection('posts')
.orderBy('createdAt', 'desc')
.limit(10)
.get()
.then((data) => {
const promises = data.map((doc) => {
return db
.doc(`/users/${doc.data().userHandle}`)
.get()
.then((userDoc) => {
return {
postId: doc.data().id,
userHandle: doc.data().userHandle,
userImageUrl: userDoc.data().imageUrl,
imageUrl: doc.data().imageUrl,
};
})
});
Promise.all(promises).then(posts => {
res.json(posts);
})
})
.catch((err) => {
console.error(err);
res.status(500).json({ error: err.code});
});
该数组为空,因为在发送响应时,带有POST的承诺仍有待解决 为了解决此问题,您可以使用
.map()
收集数组中的所有承诺,等待它们在Promise.all()
的帮助下解决,然后发送响应:
db
.collection('posts')
.orderBy('createdAt', 'desc')
.limit(10)
.get()
.then((data) => {
const promises = data.map((doc) => {
return db
.doc(`/users/${doc.data().userHandle}`)
.get()
.then((userDoc) => {
return {
postId: doc.data().id,
userHandle: doc.data().userHandle,
userImageUrl: userDoc.data().imageUrl,
imageUrl: doc.data().imageUrl,
};
})
});
Promise.all(promises).then(posts => {
res.json(posts);
})
})
.catch((err) => {
console.error(err);
res.status(500).json({ error: err.code});
});
没有运气,我仍然返回了一个带有500服务器错误的空对象。没关系,.map不工作,因为我应该调用data.docs.map,谢谢@frankied003感谢回到这里,很高兴知道这个问题已经解决了不走运,我仍然返回了一个带有500服务器错误的空对象。不管怎样,.map不工作,因为我应该调用data.docs.map,谢谢@frankied003感谢回到这里,很高兴知道问题已经解决