2016-03-18 51 views
0

İletilerin bir Firebase koleksiyonunda depolandığı bir sohbet uygulamasına sahibim.Firebase.on ('child_added') ile sonsuz döngü

const chatRef = new Firebase() 

chatRef.on('child_added', function(snapshot) { //... }) 

Ben de aynı koleksiyonun aynı olayı dinleyen bir sunucu istemci var:

koleksiyonu 'child_added' olayını dinler Bir tarayıcı istemcisi vardır. Sunucu şimdi deneyecek gibi

const chatRef = new Firebase() 

chatRef.on('child_added', function(snapshot) { 
    const outgoingMessage = processIncomingMessage(snapshot.val()) 
    chatRef.push(outgoingMessage) 
}) 

Bu durum sonsuz bir döngüye neden olur: Sunucu, istemci bir ileti koleksiyonuna eklendiğini gördüğünde bir geri arama yangınları mesajı işlemek ve koleksiyona yeni bir ileti itmek Firebase'deki koleksiyona eklediği iletileri işlemek için.

Bunu önlemek için bir yolu var mı? Verilerimi Firebase'de yeniden yapılandırmam gerektiğini düşünüyorum, ancak bunun nasıl görüneceğinden emin değilim.

cevap

0

Kaldırmanın birçok yolu vardır. Ama gerçekten bunun nasıl olmasını istediğine bağlı.

Bunu yapmanın bir yolu, sunucunun kendisine gönderilen iletileri görmezden gelmesini sağlamaktır.

var pendingKeys = []; 

bir ileti göndermek Sonra, bu listeye kendi itme id ekleyin:

Bunu yapmak için, herhangi bir öğe Gönderdiğiniz bir itme id tutan bir liste olurdu: bir child_added olsun o bekleyen tuşları listenizde olduğunda

var newRef = chatRef.push(); 
pendingKeys.push(newRef.key); 
newRef.set(outgoingMessage); 

Şimdi, mesajı dikkate.

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); 
    } 
}) 

Sen de aksi liste süresiz büyümeye devam olacağından, bu noktada listeden anahtarını kaldırmak için bir splice() kullanmak dikkat edeceğiz.

İlgili konular