如何一次设置多个onSnapshot()侦听器

时间:2017-12-07 18:53:22

标签: firebase react-native google-cloud-firestore

我正在使用react-native-firebase ^ 3.1.1和react-native ^ 0.49.5。我的应用程序的用户具有对区域的可变权限。例如,用户A可能只拥有区域1的权限,而用户B可能拥有区域1,2和3的权限。当应用程序启动时,我设置快照侦听器以侦听对应于区域的文档的更改用户有权访问。由于没有逻辑OR,我必须为每个区域循环并设置一个快照监听器,如下所示

componentDidMount() {
let { territories } = this.props
territories.forEach(territory => {
  this.unsubscribe.push(
    firebase
      .firestore()
      .collection('dispatches')
      .where('territory_id', '==', territory)
      .onSnapshot(querySnapshot => {
        const dispatches = []
        querySnapshot.forEach(document => {
          dispatches.push(document.data())
        })
        this.props.handleDispatchUpdate(territory, dispatches)
      })
  )
})
}

这似乎有效但我的应用程序在设置监听器时“冻结”。例如,如果用户尝试打开侧抽屉菜单或以任何方式与应用程序交互,则平均大约8秒或有时长达一分钟没有任何反应,那么所有操作似乎立即发生。

我添加了控制台日志语句,以检查是否是由于应用和firebase之间的网络时间造成的,如下所示

  componentDidMount() {
let { territories } = this.props
territories.forEach(territory => {
  console.log(`Starting read for territory item ${territories.indexOf(territory)}`, moment().format('hh:mm:ss'))
  this.unsubscribe.push(
    firebase
      .firestore()
      .collection('dispatches')
      .where('territory_id', '==', territory)
      .onSnapshot(querySnapshot => {
        console.log(`Finished read for territory item ${territories.indexOf(territory)}`, moment().format('hh:mm:ss'))
        const dispatches = []
        querySnapshot.forEach(document => {
          dispatches.push(document.data())
        })
        console.log(
          `Storing documents in redux store for territory item ${territories.indexOf(territory)}`,
          moment().format('hh:mm:ss')
        )
        this.props.handleDispatchUpdate(territory, dispatches)
      })
  )
})
}

结果如下记录为hh:mm:ss。有问题的用户有权访问3个地区

enter image description here

我不确定这是否与react-native-firebase包,firebase firestore本身或我如何设置多个侦听器的问题有关。任何帮助表示赞赏。

0 个答案:

没有答案