2016-04-05 15 views
0

ich versucht, um herauszufinden, warum ich bin immer Objekte in // 1 und 2 // aber // 3 ...Rückrufe/Promises in Firebase

undefined immer ich um Angular2 mit Typoskript und Firebase bin Unordnung zurück Ende.

Was mache ich falsch hier zu tun, wie ein Anfänger Fehler mir scheint ...

getPlayers() { 
     var snap; 
     this.playersRef.once('value', function (snapshot) { 
       snap = snapshot.val(); 
//1 
       console.info("snap.val()" + snapshot.val()); 
//2 
       console.info("var snap" + snap); 

      } 
     ); 
//3 
     console.info("var snap loc 2" + snap); 
     //return new Promise<Player[]>(resolve => resolve(snap)); 
    } 

///////// EDIT //////////// /////////////////////////////////

Kann jemand erklären, wie dies insbesondere auf die Firebase nosql DB bezieht (Innerhalb der Angualr2 App).

in meiner app.component.ts Datei, die ich dieses

constructor(private _playerService: PlayerService){} 

    getPlayers(){ 
     this._playerService.getPlayers().then(res => this.players = res); 
    } 

    ngOnInit(){ 
     this.getPlayers(); 
    } 

haben in der player.service.ts ich diesen

getPlayers() { 
    this.playersRef.once('value', function (snap){ 
     return snap.val(); 
    }); 
} 

ich immer bekommen Typeerror-Datei haben: this._playerService.getPlayers (...) ist nicht definiert

ich einige atricle gelesen habe, wie diese https://www.firebase.com/blog/2016-01-21-keeping-our-promises.html

aber ich kann immer noch nicht herausfinden, wie man alles zusammenarbeitet.

Auch wenn ich versuche, meine getPlayer() mit dem Versprechen (insead von Rückrufen), wie in dem Artikel zu bearbeiten ich eine Ausnahme erhalten, dass .once() Bedürfnisse mindestens zwei Parameter so bin ich nicht sicher, wie der Artikel überhaupt funktioniert mit .once('value').then()

+1

ist "einmal" async? –

+0

ja, async mit Firebase –

Antwort

1

Es sieht aus wie this.playersRef.once asynchron ist.

Dies bedeutet, dass die dritte console Anweisung vor dem Rückruf von once läuft die Ausführung, so dass die variable snapundefined noch zu diesem Zeitpunkt sein.

die Folge von console Aussagen ist also eigentlich 3, 1, 2, statt 1, 2, 3.

1

Es undefiniert ist seit // 3 sofort ausgeführt wird, auch wenn der Rückruf nicht unbedingt ausgeführt hat wenn die // 3 log-Anweisung aufgerufen wird, ist snap noch nicht festgelegt. Es ist nicht undefined wegen Scoping-Probleme, es ist undefined, weil es nicht zum Zeitpunkt der Überprüfung des Werts festgelegt ist.

dieses Rennen, sollten Sie erkennen, dass // 3 sofort Ihnen nicht definiert, dann // 1 druckt, dann // 2 Druck gibt. Denk darüber nach.

+0

yup, ich sah das in der Konsole. Macht Sinn. –