【问题标题】:Promises in angular2 with firebase带有firebase的angular2中的承诺
【发布时间】:2016-07-25 22:36:48
【问题描述】:

谁能解释一下如何在 Angular2 和 Firebase 中正确实现 promise。

我读过一些文章,例如https://www.firebase.com/blog/2016-01-21-keeping-our-promises.html

在我的 app.component.ts 文件中我有这个

export class AppComponent{
    players: Player[];

    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

我也按照上面文章的建议尝试了这个

getPlayers() {
    var data;
    this.playersRef.once('value').then( function (snap){
        data = snap.val();
    });
    return data;
}

但后来我得到了这个:错误:Query.once failed: was called with 1 argument.预计至少 2. in [null]

我不确定这篇文章如何使用 .once('value').then()

【问题讨论】:

    标签: firebase promise angular angular2-services


    【解决方案1】:

    出现问题是因为您尝试使用.then 而不是未使用promise 的方法。基本上错过了从getPlayers 方法返回promise,您应该从那里返回promise 以使用.then 方法对其执行promise 链接。

    也不要使用回调从它返回值(因为回调不能从它返回任何东西),使用.then函数而不是.once,这样你就可以扩展承诺链并能够返回数据正确。

    代码

    getPlayers() {
        //returned promise here
        return this.playersRef.once('value').then((snap) => {
            return snap.val();
        });
    }
    

    【讨论】:

    • .once() 是异步的,这就是为什么我在它上面使用了.then,这样一旦承诺完成,数据就会返回..看看更新的答案..我缺少箭头函数=>.then..
    • 对不起,我没有意识到你已经更新了你的答案。如果我只使用.once('value').then(...) 错误:Query.once failed: Was called with 1 argument. Expects at least 2.,这就是我得到的结果,所以我可能不得不通过回调来做,但我不确定如何
    • 看起来我可能正在使用不支持 .once() 语法的旧版 firebase SDK
    • 是的..您使用的是旧版本..我认为您可能需要更新 typings.ts(不太确定)。您在答案中提到的链接具有相同的 paatern ..我使用过..
    • 非常有用!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多