有什么方法可以在不删除它的情况下暂停 Firestore 侦听器?

IT技术 reactjs firebase google-cloud-firestore
2021-05-06 01:12:50

有没有办法在不删除它的情况下暂停 Firestore 侦听器?

我有多个 firebase 侦听器,其中一些依赖于其他侦听器,这些侦听器会在数据更改时更改或启动其他侦听器。假设我的第一个侦听器启动了第二个侦听器onSnapshot第一个侦听器开始于useEffect. 对于某些情况,我可能不想更改第二个侦听器,因此我需要丢弃来自第一个侦听器的数据更改更新。

如果条件满足(单击按钮),我会暂时丢弃第一个侦听器上的数据更改。目前我正在使用带有useRef. 我的react应用程序运行良好,有这样的依赖侦听器。我可以删除监听器,但我不想删除并重新创建监听器。

我想知道是否有可供任何听众使用的暂停机制或方法。我认为如果有这样的方法,它将节省很小的读取成本,因为我没有使用在 Snapshot 上发送的数据。

代码示例:

useEffect(() => {
let  firstListener, secondListener;
//console.log("useEffect...");

function ListenerFunc(p) {
 secondListener = await firestore
    .collection("test") 
    .doc(p)
    .onSnapshot((doc) => {
      //console.log("Current data: ", doc.data());

      //Need to discard unwanted change here. 
      //Changing it on button click for a 2 seconds then it changes back to : pauser.current = false.
      if (pauser.current) {
        console.log("paused for a moment.");
        //pauser.current = false;
        return;
      }
    else {
          //update.
         }
    })
  }

 firstListener = firestore
        .collection("test")
        .doc("tab")
        .onSnapshot((doc) => {
          //console.log("Current data: ", doc.data()); 
          var p = doc.data().p; //get variable p

          ListenerFunc(p);
        });
  // cleanup.
}
1个回答

不幸的是,这是不可能的。如果你需要停止监听变化,即使是暂时的,当你想再次开始监听时,你必须分离你的监听器并附加一个新的监听器,监听器没有暂停机制。

如果您愿意,您可以在Google 的问题跟踪器中打开一个功能请求,以便产品团队可以考虑这一点,但鉴于此GitHub 功能请求已在此IOS SDK 的 GitHub 功能请求中提出,但被拒绝了,我看不到这很快就会改变。