有人可以解释如何在Angular2和Firebase中正确实现承诺。
我读过一些文章,例如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(...)未定义
我也试过这个,因为最上面的文章建议
getPlayers() {
var data;
this.playersRef.once('value').then( function (snap){
data = snap.val();
});
return data;
}
但后来我明白了:错误:Query.once失败:用1参数调用。在[null]中预计至少为2.
我不确定文章是如何使用.once('value')。然后()
答案 0 :(得分:4)
出现问题是因为您尝试使用.then
而不是使用承诺的方法。基本上错过了从promise
方法返回getPlayers
,你应该从那里返回promise以使用.then
方法执行promise链接。
也不要使用回调来从中返回值(因为回调无法从中返回任何内容),在.then
上使用.once
函数,这样就可以扩展promise chain& ;将能够正确地返回数据。
<强>代码强>
getPlayers() {
//returned promise here
return this.playersRef.once('value').then((snap) => {
return snap.val();
});
}