.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);
})