Функция asyn c возвращает пустой массив, не считает ожидание? - PullRequest
0 голосов
/ 02 апреля 2020

Надеюсь, вы все в безопасности.

Поэтому я пытаюсь получить все сообщения друзей текущего пользователя, но это не работает, я всегда получаю пустой массив, это как функция отправить массив в ответ, прежде чем использовать все l oop.

Итак, что я делаю, это

  1. получение всех друзей текущего пользователя

  2. отображение всех его друзей, чтобы получить все сообщения каждого из друзей

  3. Затем я сопоставляю все его сообщения и пу sh каждого сообщения в массиве

  4. Наконец, я хочу, чтобы функция отправляла массив, содержащий каждый пост, когда все l oop закончились, но это не работает, я всегда получаю пустой массив , Я король новичка в обещании и асинк / жду волка, но я не понимаю его.

Функция выглядит следующим образом

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 
} 

Ответы [ 2 ]

3 голосов
/ 02 апреля 2020

Попробуйте это.

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 
} 
1 голос
/ 02 апреля 2020

Вы используете методы then и async/await для обработки обещаний. Ваш первый шаг - просто использовать await.

const result = await friendsReference.get()

Итак, в основном вы ожидаете then, который является обработчиком обещания, а не обещанием, поэтому он не ждет его Фини sh.

...