当前位置: 代码迷 >> JavaScript >> 如何从也位于循环内的firebase中的onSnapshot函数内部插入数组的值
  详细解决方案

如何从也位于循环内的firebase中的onSnapshot函数内部插入数组的值

热度:55   发布时间:2023-06-12 14:01:43.0

如果我将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);
    })

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