Javascript 在foreach循环中调用异步函数,循环完成后返回数组

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 = [];

我试图从foreach循环中的API请求数据,并将该数据推送到一个数组,然后在最后返回该数组。这是我的密码:

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感谢回到这里,很高兴知道问题已经解决