2016-03-18 1 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

Существует множество способов удалить его. Но это действительно зависит от того, как вы хотите, чтобы это работало.

Один из способов сделать это - заставить сервер игнорировать сообщения, отправленные им самим.

Чтобы сделать это, нужно иметь список, который держит нажимной идентификатор любых предметов, которые вы посылаете:

var pendingKeys = []; 

Затем, когда вы отправляете сообщение, вы добавляете его нажимной идентификатор в этот список:

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() для удаления ключа из списка на данный момент, так как в противном случае список будет продолжать расти до бесконечности.