【问题标题】:Call an async function in foreach loop and return array once loop is done在 foreach 循环中调用异步函数并在循环完成后返回数组
【发布时间】:2020-11-14 14:17:22
【问题描述】:

我正在尝试在 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 数组返回 en 空数组或对象,即使我将 return res.json(posts) 替换为

.then(() => {
return res.json(posts);
})

任何帮助都很棒!!!

【问题讨论】:

标签: javascript asynchronous foreach google-cloud-firestore promise


【解决方案1】:

数组是空的,因为在发送响应时,带有帖子的承诺仍在等待解决。

为了解决这个问题,您可以使用.map() 将所有promise 收集到一个数组中,等待它们在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 感谢您回复此问题,很高兴知道问题已解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 2014-05-12
相关资源
最近更新 更多