为什么每次 Firebase 中的数据更新时,我的聊天机器人都会从 Firebase 重新加载?

问题描述 投票:0回答:1

我正在尝试最大程度地减少聊天机器人向 Firebase 发送和从 Firebase 发送的不必要的数据。它可以正确地跨设备同步,但是,每次更新数据时,它都会将整个状态加载到每个设备,包括触发更新的设备(因此已经包含正在加载的所有状态数据)。

奇怪的是,由于控制台日志,我知道正在调用 loadGroupData,但在我的代码中唯一一次提到此函数是在此函数中,并且控制台从不记录“正在加载组状态:”,savedCurrentGroup)除了初始负载之外:

function loadGroupState(savedCurrentGroup) {
  // Log the group being loaded
  console.log("Loading group state for:", savedCurrentGroup);

  // Reference to the group in Firebase
  const groupRef = ref(db, `groups/${String(savedCurrentGroup)}`);

  return new Promise((resolve, reject) => {
      onValue(groupRef, (snapshot) => {
          const groupData = snapshot.val();
          if (groupData) {
              // If group data exists, load it into the chatbot state
              document.getElementById("initialContainer").style.display = "none";
              **loadGroupData(groupData)**; // Call a separate function to load the data
              
              resolve(groupData); // Resolve the promise
              updateFlag();
              
          } else {
              // No data found, initialize default state instead of rejecting
              console.log("No data found for this group. Initializing default state.");
              const defaultGroupData = {
                  stage: 0,
                  navyStage: 0,
                  userName: 'You',
                  currentClueIndex: 0,
                  penaltyPoints: 0,
                  navySupported: false,
                  accessible: false,
                  navyReminderSent: 0,
                  totalPausedTime: 0,
                  pauseStartTime: 0,
                  startTime: 0,
                  userNumber: 1,
                  hintsRequested: 0,
                  currentGroup: savedCurrentGroup,
                  navyDeceived: false,
                  typingmessage: false,
              };

              // Load the default group state
              loadGroupData(defaultGroupData);
              resolve(defaultGroupData); // Resolve with default data instead of rejecting
              saveStateAndLog();
          }
      }, (error) => {
          reject(error); // Reject the promise on error
      });
  });
}

这怎么可能?

我对编码还很陌生,所以我可能做了一些明显错误的事情。

我尝试添加代码来抑制事件侦听器上的本地更新,但这不起作用。控制台记录“更新被抑制”,但聊天机器人仍然执行不必要的加载。


function listenForChanges() {
  const groupRef = ref(db, `groups/${currentGroup}`);
  

  // Attach listeners for real-time updates after the initial load
  onValue(child(groupRef, 'chatLog'), (snapshot) => {
      if (suppressLocalUpdates){
         console.log ('update suppressed');

         return; }// Ignore if this instance caused the update
      if (snapshot.exists()) {
          chatLog.innerHTML = snapshot.val() || '';
      }
  });

  onValue(child(groupRef, 'stage'), (snapshot) => {
    if (suppressLocalUpdates){
      console.log ('update suppressed');

      return; }
      if (snapshot.exists()) {
          stage = snapshot.val() || 0;
      }
  });

javascript firebase firebase-realtime-database
1个回答
0
投票

onValue
回调始终会被调用,并在您调用它的位置提供数据的完整快照。即使仅更改或添加了一个子项,
snapshot
onValue
也始终包含路径中的所有数据。

如果您只想了解所做的确切更改,则需要使用

onChild...
事件。这些在使用数据列表的文档中进行了解释,所以我建议阅读该文档。例如,当子节点(例如聊天消息)添加到列表中时,您可以使用
onChildAdded
获取该特定消息的快照。

© www.soinside.com 2019 - 2024. All rights reserved.