猿问

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

我试图在 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) 替换为


.then(() => {

return res.json(posts);

})

任何帮助都很棒!!!


慕丝7291255
浏览 184回答 1
1回答

蛊毒传说

该数组为空,因为在发送响应时,带有帖子的承诺仍在等待解决。为了解决这个问题,您可以使用 收集数组中的所有承诺.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});  });
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答