Как вставить значение массива в функцию onSnapshot из firebase, которая также находится внутри цикла - PullRequest
0 голосов
/ 13 февраля 2019

Если я помещу arr.push () вне функции onSnapshot, это единственный раз, когда массив вернет значение.Но все, что я хочу, это вставить данные в onSnapshot.Кто-нибудь может помочь мне в решении этой проблемы?

inboxTodo.get().then(snap => {
      let arr = [] //Initialize array.
      snap.data().todos.forEach(todo => {
        cars.doc(String(doc.data().id)).collection('todo').doc(String(todo))
        .onSnapshot(t => {
          const value = {
            id: doc.data().id,
            value: t.data()
          }
          arr.push(value) // insert some data inside the array.
          this.props.setTodo(value)
        }, err => {
          alert(err)
        })
      }, err => {
        alert(err)
      })
      console.log(arr) //returns an empty array :(
    }, err => {
      alert(err);
    })

1 Ответ

0 голосов
/ 13 февраля 2019

.onSnapshot принимает обратный вызов, который является асинхронным.Поэтому, когда ваш console.log выполняется, ни один из обратных вызовов .onSnapshot не был разрешен, поэтому ваш массив все еще пуст.Вы можете узнать, когда сработали все обратные вызовы моментального снимка, пообещав их.Вам нужно будет сделать что-то вроде этого: (не проверено)

inboxTodo.get().then(snap => {
      let promiseArr = [] // make an array of promises to be executed
      
      snap.data().todos.forEach(todo => {
      
      // Promisify each .onSnapshot
      promiseArr.push(new Promise(resolve => {
          cars.doc(String(doc.data().id)).collection('todo').doc(String(todo))
        .onSnapshot(t => {
          const value = {
            id: doc.data().id,
            value: t.data()
          }
          resolve(value) // resolve the new promise

          this.props.setTodo(value)
        }, err => {
          alert(err)
        })
        });
      }, err => {
        alert(err)
      })
      
      // exectue all promises
      Promise.all(promiseArr)
        .then(values => {
          console.log(values) // all your array values will be here
        })
    }, err => {
      alert(err);
    })
...