【问题标题】:async function return empty array, does not consider the await?async函数返回空数组,不考虑await?
【发布时间】:2020-07-14 16:39:38
【问题描述】:

希望大家都平安。

所以我试图获取当前用户的所有朋友的帖子但它不起作用,我总是收到一个空数组,就像函数在执行所有循环之前将数组发送到响应一样。

所以我正在做的是

  1. 获取当前用户的所有好友

  2. 映射他所有的朋友以获得每个朋友的所有帖子

  3. 然后我映射他的所有帖子并将每个帖子推送到一个数组中

  4. 最后,我希望函数在所有循环结束时发送包含每个帖子的数组,但它不起作用,我总是得到一个空数组。我是诺言和异步/等待世界的新手,但我不明白。

函数是这样的

exports.getFollowerPost = async (req, res) => {
    const id_user  = req.params.userUid;

    let friendsReference = db.collection('Friends').doc(id_user);

    let data = [];

    await  friendsReference.get().then((result) => {

        if (!result.exists) {
            console.log('No such document!');
            res.send('no docs exist')
          } 
          else {
              let friends  = result.data();

              let friendsOfUser = friends.follow;

               friendsOfUser.map((follow)  => {

                let postUser =  db.collection('Post').doc(follow);

                 postUser.get().then(item => {

                    const eachPost = item.data().post;

                    eachPost.map(eachPostUser => {
                        data.push(eachPostUser);
                        console.log("add post")
                    })
                }).catch(error => {
                    console.log(error)
                })
              })          
          }   
    })
    .catch(error =>  {
        res.status(400).send(error)
    })

    res.send(data) // always send a empty array ? why 
} 

【问题讨论】:

    标签: node.js firebase express google-cloud-firestore async-await


    【解决方案1】:

    试试这个。

    exports.getFollowerPost = async (req, res) => {
      const id_user = req.params.userUid;
    
      let friendsReference = db.collection('Friends').doc(id_user);
    
      let data = [];
    
      try {
        const result = await friendsReference.get();
    
        if (!result.exists) {
          console.log('No such document!');
          res.send('no docs exist')
        }
        else {
          let friends = result.data();
    
          let friendsOfUser = friends.follow;
    
          friendsOfUser.map(async (follow) => {
    
            let postUser = db.collection('Post').doc(follow);
    
            const item = await postUser.get()
    
            const eachPost = item.data().post;
    
            eachPost.map(eachPostUser => {
              data.push(eachPostUser);
              console.log("add post")
            })
    
    
          })
        }
      } catch (error) {
        res.status(400).send(error)
      }
    
      res.send(data) // always send a empty array ? why 
    } 
    

    【讨论】:

    • 你必须删除那个底部catch,但是除此之外它看起来还不错。
    • 非常感谢你们两个对我的帮助。感谢 Julio 的代码。我试过了但没有用,我添加了错误,“await 只能在异步函数中使用”,起初我想知道这个错误是从哪里来的,因为我在函数的开头明确声明了异步。我意识到问题是创建同步箭头功能的地图。(项目=> {})。我已经用一个简单的 for 循环替换它,现在它正在工作。谢谢
    • 现在我想一想你会想要坚持那个循环的 then 风格承诺。或者将所有承诺推送到一个数组并使用Promise.all
    • 目前它的方式是一次只运行一个异步操作,这可能会大大减慢这个家伙的速度。
    【解决方案2】:

    您正在混合使用 thenasync/await 处理承诺的方法。您的第一步是坚持使用 await。

    const result = await friendsReference.get()
    

    所以基本上你在等待then,它是一个承诺的处理程序,而不是一个承诺,所以它不会等待它完成。

    【讨论】:

      猜你喜欢
      • 2021-08-06
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      相关资源
      最近更新 更多