我试图找出为什么我在// 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()
答案 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打印。想一想。