我有一个聊天应用程序,其中的消息存储在Firebase集合中。
有一个浏览器客户端可以监听“child_added”事件 系列:
const chatRef = new Firebase()
chatRef.on('child_added', function(snapshot) { //... })
我还有一个服务器客户端,它在同一个集合上侦听同一个事件。当服务器客户端发现消息已添加到集合中时,将触发回调以处理消息,并将新消息推送到集合中:
const chatRef = new Firebase()
chatRef.on('child_added', function(snapshot) {
const outgoingMessage = processIncomingMessage(snapshot.val())
chatRef.push(outgoingMessage)
})
这导致无限循环,因为服务器现在将尝试处理已添加到Firebase上的集合的消息。
有没有办法避免这种情况?我想我需要在Firebase中重构我的数据,但我不太确定这应该是什么样的。
答案 0 :(得分:0)
有很多方法可以删除它。但这实际上取决于你希望如何工作。
执行此操作的一种方法是使服务器可以忽略它自己发送的消息。
为此,您需要一个列表来保存您发送的任何项目的推送ID:
var pendingKeys = [];
然后,当您发送消息时,将其推送ID添加到此列表中:
var newRef = chatRef.push();
pendingKeys.push(newRef.key);
newRef.set(outgoingMessage);
现在,当您收到child_added
时,您会在待处理密钥列表中忽略该消息。
chatRef.on('child_added', function(snapshot) {
var index = pendingKeys.indexOf(snapshot.key());
if (index >= 0) {
const outgoingMessage = processIncomingMessage(snapshot.val())
chatRef.push(outgoingMessage)
}
else {
pendingKeys.splice(index,1);
}
})
您注意到我此时也使用splice()
从列表中删除密钥,否则列表将无限期地增长。