Firebase中的回调/承诺

时间:2016-04-05 17:41:14

标签: firebase angular

我试图找出为什么我在// 1和// 2中获取对象但在// 3处未定义...

我正在使用Typescript和Firebase后端弄乱Angular2。

我在这里做错了什么,在我看来像是一个菜鸟的错误...

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

/////////编辑///////////////////////////////////// ////////

有人可以解释这是如何与Firebase nosql DB特别相关的(Angualr2 app内部)。

在我的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(...)未定义

我已经阅读了一些像这样的文章 https://www.firebase.com/blog/2016-01-21-keeping-our-promises.html

但我仍然无法弄清楚如何让一切都协同工作。

此外,当我尝试编辑我的getPlayer()承诺(回调的内容)时,如文章中我得到一个例外,说明.once()至少需要两个参数,所以我不确定文章如何与.once('value').then()

一起工作

2 个答案:

答案 0 :(得分:1)

看起来this.playersRef.once是异步的。

这意味着第三个console语句将在once执行回调之前运行,因此snap变量在该时间点仍为undefined

因此,console语句的顺序实际上是3,1,2,而不是1,2,3。

答案 1 :(得分:1)

它是未定义的,因为// 3立即执行,即使回调可能不一定在// 3日志语句被调用时运行,这意味着snap尚未设置。由于范围问题,它不是undefined,而是undefined,因为它在您检查值时未设置。

运行这个,你应该意识到// 3立即给你未定义,然后 //打印,然后 // 2打印。想一想。