问题描述
如果我将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楼
.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); })