【问题标题】:Callbacks/Promises in FirebaseFirebase 中的回调/承诺
【发布时间】:2016-04-06 08:03:45
【问题描述】:

我试图弄清楚为什么我在 //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.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(...) is undefined

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

但我仍然不知道如何让所有东西协同工作。

此外,当我尝试使用文章中的承诺(而不是回调)编辑我的getPlayer() 时,我收到一个异常,指出.once() 至少需要两个参数,所以我不确定文章的工作情况如何都是.once('value').then()

【问题讨论】:

  • 是的,与 Firebase 异步

标签: firebase angular


【解决方案1】:

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

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

所以,console 语句的顺序实际上是 3、1、2,而不是 1、2、3。

【讨论】:

    【解决方案2】:

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

    运行这个,你应该意识到 //3 立即给你 undefined,then //1 打印,then //2 打印。考虑一下。

    【讨论】:

    • 是的,我在控制台中看到了。有道理。
    猜你喜欢
    • 2016-06-15
    • 2018-09-27
    • 2017-03-11
    • 2016-09-28
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多