我正在尝试最大程度地减少聊天机器人向 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;
}
});
等
onValue
回调始终会被调用,并在您调用它的位置提供数据的完整快照。即使仅更改或添加了一个子项,snapshot
的 onValue
也始终包含路径中的所有数据。
如果您只想了解所做的确切更改,则需要使用
onChild...
事件。这些在使用数据列表的文档中进行了解释,所以我建议阅读该文档。例如,当子节点(例如聊天消息)添加到列表中时,您可以使用 onChildAdded
获取该特定消息的快照。