使用Firebase.on('child_added')的无限循环

时间:2016-03-18 22:47:53

标签: javascript firebase firebase-realtime-database

我有一个聊天应用程序,其中的消息存储在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中重构我的数据,但我不太确定这应该是什么样的。

1 个答案:

答案 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()从列表中删除密钥,否则列表将无限期地增长。