2016-05-30 10 views
9

Edytuj Aby wyjaśnić: Mam dwie problemy. 1. Dlaczego mój węzeł jest nadpisany? 2. Dlaczego callback najwyraźniej nazywa się rekursywnie?System obecności Firebase: nigdy nie przestaje pisać

Podążam za this guide, aby zaimplementować system obecności na mojej aplikacji internetowej. Chcę, aby wszyscy zalogowani użytkownicy zawsze mogli wiedzieć, czy wszyscy inni użytkownicy są online, czy nie. Oto mój kod:

currentGameRef = gamesInProgressRef.child(newState.currentTable); 
    var myConnectionsRef = currentGameRef.child("player" + newState.myPlayerNumber).child("connections"); 
    var lastOnlineRef = currentGameRef.child("player" + newState.myPlayerNumber).child("lastOnline"); 

    var connectedRef = firebase.database().ref('.info/connected'); 
    connectedRef.on("value", function(snap) { 
    if(snap.val() == true){ 
     var con = myConnectionsRef.push(true); 
     con.onDisconnect().remove(); 

     lastOnlineRef.onDisconnect().set(firebase.database.ServerValue.TIMESTAMP); 
    } 
    }); 

Kiedy przetestować kod, to pisze tysiące true aby każdy z graczy „Połączenia” -node. Dziwne jest to, że wszystkie inne dzieci każdego gracza są wymazane. Dlaczego to się dzieje? węzeł A gracz wygląda następująco:

"player1" : { 
    "name": "Vladimir Putin", 
    "country": "Russia", 
    ..., 
    ..., 
    "connections" : { 
    ... 
    ... 
    } 
} 

Nie ustawić „Gracz1” -node w moim kodzie, tylko dziecko niego. Wiem na 100%, że to powyższy kod powoduje to zachowanie, ale nie mogę zrozumieć dlaczego. Czy ktoś może mi powiedzieć, dlaczego powyższy kod usuwa węzły gracza?

+0

jakie są wartości 'snap.val()'? czy istnieje powód, dla którego zmieniłeś '===' na '=='? –

+0

Nie, właśnie zrobiłem to przypadkowo. Zmieniłem to teraz. Ta sama rzecz. Wartość snap.val() musi być prawdziwa, ponieważ wprowadza fragment kodu i wypycha inną wartość true w tablicy połączeń. – hellogoodnight

+0

Co to jest zmienna 'newState' pojawiająca się wielokrotnie w kodzie? – vzsg

Odpowiedz

0

Wygląda na to, że coś poszło nie tak ze zmiennymi dołączonymi do newState. Zrobiłem ten test tutaj:

// Initialize Firebase 
var config = { 
    apiKey: '<your-api-key>', 
    authDomain: '<your-auth-domain>', 
    databaseURL: '<your-database-url>', 
    storageBucket: '<your-storage-bucket>' 
}; 
firebase.initializeApp(config); 

// fixed values just for test 
var newState = { 
    myPlayerNumber: 1, 
    currentTable: 2 
}; 

var gamesInProgressRef = firebase.database().ref('games'); 
currentGameRef = gamesInProgressRef.child(newState.currentTable); 
var myConnectionsRef = currentGameRef.child("player" + newState.myPlayerNumber).child("connections"); 
var lastOnlineRef = currentGameRef.child("player" + newState.myPlayerNumber).child("lastOnline"); 

var connectedRef = firebase.database().ref('.info/connected'); 
connectedRef.on("value", function(snap) { 
    if(snap.val() == true){ 
    var con = myConnectionsRef.push(true); 
    con.onDisconnect().remove(); 
    lastOnlineRef.onDisconnect().set(firebase.database.ServerValue.TIMESTAMP); 
    } 
}); 

I mam następujące happening.

1) Po pierwsze klient podłączony

First client connected

2) Po drugie klient podłączony

Second client connected

3) Zarówno klienci odłączony

Both clients disconnected

Wydaje mi się, że jest to pożądany wynik. Więc spróbuj debugować to, co jest używane jako newState, może otrzymujesz "niezdefiniowane" lub jakąś inną stałą wartość.

+1

Dzięki za poświęcenie czasu. Przetestuję ten kod od jakiegoś czasu. Wrócę do ciebie! – hellogoodnight

Powiązane problemy