2016-05-18 6 views
0

Ich verwende firebase-queue in einer mobilen App, um einige Arbeit auf einen Server auszulagern. Ich sende Aufgaben mit einer Anfrage an die Firebase-Queue und beginne, 'value' -Ereignisse unter responses/<request-id> anzuhören, um die Antwort für die Aufgabe zu erhalten. Der Mitarbeiter der Warteschlangenwarteschlange erhält die Aufgabe, verarbeitet sie und legt die Ergebnisse auf responses/<request-id> fest.Firebase 'Wert' Event-Handler wird zuerst mit Null-Wert und dann mit dem tatsächlichen Wert

Ich beobachte, dass der value Event-Handler zweimal aufgerufen wird, zunächst mit einem Nullwert und dann wird die tatsächliche Antwort. Ich habe diesen Beispielcode, der verwendet werden kann, das Verhalten

Client.js

var Firebase = require('firebase'); 

var ref = new Firebase('https://propertyfindercp.firebaseio.com'); 

ref.child('responses/<request-id>').on('value', function(snapshot) { 
    console.log('Value event ', snapshot.val()); 
}); 

worker.js

var Firebase = require('firebase'); 

var ref = new Firebase('https://propertyfindercp.firebaseio.com'); 
ref.child('responses/<request-id>').set({data: 123}); 

Ersetzen Sie einfach die <request-id> in beiden Dateien zu simulieren einige gleiche zufällige Wert und führen Sie die client.js Datei mit node client.js und dann die worker.js mit node worker.js

Ich beobachte die folgende Ausgabe auf der Client-Konsole

Value event null 
Value event { data: 123 } 

Ich habe erwartet, nur die zweite Linie zu sehen. Warum wird der value Event-Handler mit einem null Wert auch aufgerufen?

Antwort

2

Wenn Sie den Listener starten, gibt es an der Position responses/<request-id> keinen Wert. Der Firebase-Client löst also ein value Ereignis mit einem null Wert aus. Wenn ein Wert in responses/<request-id> geschrieben wird, wird das Ereignis value erneut mit dem neuen Wert ausgelöst. Wenn Sie den Wert von responses/<request-id> löschen, erhalten Sie ein weiteres value Ereignis mit null.

+0

@ FrankvanPuffelen Ich verstehe, dass, wenn ich den Wert von 'Antworten/' lösche, würde ich ein anderes 'Wert' Ereignis mit' null' Wert erhalten, weil ich tatsächlich eine 'null' an dieser Stelle, aber es ist ein bisschen Zähler -intuitiv, dass ich einen Nullwert erhalte, wenn ich zum ersten Mal einen 'Wert'-Ereignishandler an einem Ort anschließe. Tatsächlich macht es den Event-Handler "once" in diesem Fall irgendwie unbrauchbar, weil es am Ende mit einem "null" -Wert aufgerufen wird und nicht aufgerufen wird, wenn der Wert tatsächlich gesetzt ist. Was ist der Zweck des Aufrufs des Ereignishandlers "value" mit dem Wert "null", wenn er zum ersten Mal angefügt wird? 1 –

+0

Außerdem weiß ich nicht einmal, ob ein 'value' Event-Handler mit 'null'-Wert aufgerufen wird, liegt es daran, dass der Wert an dieser Stelle gelöscht wird, damit ich ihn entsprechend behandeln kann oder nur der erste Aufruf ist. Also, ich könnte am Ende mit etwas mehr Wenn-sonst Logik im Code 2 –

+1

Ich erklärte, wie die API funktioniert. Hier ist, wie Sie einen Listener "warten auf Wert" machen können, was wahrscheinlich ist, was Sie versuchen zu tun: https://twitter.com/puf/status/719889323655634945 –

Verwandte Themen