2016-03-18 52 views
0

我有一个聊天应用程序,其中的消息存储在Firebase集合中。用Firebase.on无限循环('child_added')

有监听的 集合“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

有很多方法可以将其删除。但这取决于你想如何工作。

做到这一点的一种方法是让服务器可以忽略它自己发送的消息。

要做到这一点,你就会有一种可以将您所发送的任何物品推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()在这一点上从列表中删除的关键,否则该列表会继续无限增长。