2016-04-05 2 views
0

Я пытаюсь выяснить, почему я получаю объекты // 1 и // 2, но получение не определено на // 3 ...Callbacks/Promises в Firebase

Я бездельничал Angular2 с машинопись и Firebase назад конец.

Что я делаю неправильно здесь, мне кажется, как новобранец ошибку ...

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 //////////// /////////////////////////////////

Может кто-нибудь объяснить, как это относится к БД Firebase nosql, в частности (Внутри приложения Angualr2).

в моем app.component.ts файл у меня есть этот

constructor(private _playerService: PlayerService){} 

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

    ngOnInit(){ 
     this.getPlayers(); 
    } 

Внутри player.service.ts файл У меня есть этот

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

Я всегда получаю TypeError: this._playerService.getPlayers (...) не определено

Я читал некоторые atricle, такие как это https://www.firebase.com/blog/2016-01-21-keeping-our-promises.html

, но я до сих пор не могу понять, как заставить все работать вместе.

Кроме того, когда я пытаюсь изменить мои getPlayer() обещаниями (в INSEAD обратных вызовов), как в статье я получаю исключение о том, что .once() потребности по крайней мере, два параметра, так что я не знаю, как эта статья работает на всех с .once('value').then()

+1

«один раз» асинхронный? –

+0

yes, async with Firebase –

ответ

1

Похоже, что this.playersRef.once является асинхронным.

Это означает, что третье console заявление будет работать до обратного вызова once исполняющего, таким образом, переменная snap еще будет undefined в этот момент времени.

Таким образом, последовательность console утверждений на самом деле 3, 1, 2, а не 1, 2, 3.

1

Это не определено, так как // 3 выполняется немедленно, даже если обратный вызов не обязательно может быть работать к тому времени, когда вызывается оператор журнала 3 3, значение snap еще не установлено. Это не undefined из-за проблем с определением области, это undefined, потому что он не установлен во время проверки значения.

Запуск этого, вы должны понимать, что // 3 сразу же дает неопределен, затем // 1 принты, затем // 2 печатает. Подумай об этом.

+0

yup, я видел это в консоли. Имеет смысл. –

Смежные вопросы