2016-05-30 11 views
9

Modifica Per chiarire: Ho due problemi. 1. Perché il mio nodo viene sovrascritto? 2. Perché la richiamata viene chiamata apparentemente in modo ricorsivo?Sistema di presenza Firebase: non smette mai di scrivere

Seguo this guide per implementare un sistema di presenza sulla mia webapp. Voglio che tutti gli utenti registrati siano sempre in grado di sapere se tutti gli altri utenti sono online o meno. Ecco il mio codice:

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

Quando ho testare il codice, scrive migliaia di true a ciascuno dei giocatori "connessioni" -node. La cosa strana è che tutti gli altri bambini di ogni giocatore vengono cancellati. Perché sta succedendo? nodo Un giocatore simile a questa:

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

non ho impostato il -node "player1" nel mio codice, solo un bambino di esso. So per il 100% che è il codice sopra che causa questo comportamento, ma non riesco a capire perché. Qualcuno può dirmi perché il codice sopra cancella i nodi del giocatore?

+0

quali sono i valori di 'snap.val()'? c'è una ragione per cui hai cambiato '===' in '=='? –

+0

No, l'ho fatto solo accidentalmente. L'ho cambiato ora. Stessa cosa. Il valore di snap.val() deve essere vero poiché immette lo snippet di codice e spinge un altro jet vero sull'array delle connessioni. – hellogoodnight

+0

Che cosa è questa variabile 'newState' che appare nel tuo codice più volte? – vzsg

risposta

0

Sembra che qualcosa sia andato storto con le variabili fornite con newState. Ho fatto questo test qui:

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

E ho il seguente successo.

1) Prima client collegato

First client connected

2) Secondo client collegato

Second client connected

3) Entrambi i client disconnessi

Both clients disconnected

Mi sembra che questo sia il risultato desiderato. Quindi prova a eseguire il debug di ciò che viene utilizzato come newState, forse stai diventando 'indefinito' o qualche altro valore fisso.

+1

Grazie per il tempo che ci hai dedicato. Proverò questo codice per un po '. Tornerò da te! – hellogoodnight

Problemi correlati