Javascript Angular 2 w/TypeScript Firebase API返回服务中但组件中未定义的对象数组
我正在尝试在Angular 2应用程序中使用Firebase API 以下是我的服务:Javascript Angular 2 w/TypeScript Firebase API返回服务中但组件中未定义的对象数组,javascript,angular,firebase,firebase-realtime-database,Javascript,Angular,Firebase,Firebase Realtime Database,我正在尝试在Angular 2应用程序中使用Firebase API 以下是我的服务: fbGetData() { firebase.database().ref('/path/to/data').on('value',(snapshot) => { this.data = snapshot.val(); console.log(this.data); //This logs my data retur
fbGetData() {
firebase.database().ref('/path/to/data').on('value',(snapshot) => {
this.data = snapshot.val();
console.log(this.data); //This logs my data
return this.data;
})
}
这是我的组件中的内容:
ngOnInit() {
this.data = this.dataService.fbGetData();
console.log(this.data); //This logs undefined
}
组件记录未定义的对象,然后服务记录对象数组。提前感谢您的帮助。正如@jornsharpe评论的那样:Firebase从其异步服务器检索数据。您的浏览器不会等待此结果,因为这会阻止用户执行其他操作。因此,您无法从
fbGetData
返回数据,因为它尚未加载
使用异步加载有两种方法:
fbGetData() {
firebase.database().ref('/path/to/data').on('value',(snapshot) => {
this.data = snapshot.val();
console.log(this.data);
})
}
fbGetData();
因此,日志记录现在完全在on()
回调中
当然,您可能希望在不同的时间对数据执行不同的操作,因此可以将回调传递到fbGetData()
:
当然,在这个阶段,你应该考虑如果你不应该简单地用快照调用你自己的回调:
fbGetData(callback) {
firebase.database().ref('/path/to/data').on('value',callback);
}
fbGetData(data => console.log(data.val()));
还愿
在上面的示例中,当数据最初从服务器加载时以及服务器上的数据发生更改时,将打印数据。这是Firebase数据库魔力的一部分:它同步当前值和对该值的任何更改
如果只关心当前值,还可以使用once()
。此方法可以接受回调,但也可以返回承诺。这意味着您可以从fbGetData
返回一些内容:
fbGetData(callback) {
firebase.database().ref('/path/to/data').on('value',(snapshot) => {
this.data = snapshot.val();
callback(this.data);
})
}
fbGetData(data => console.log(data));
fbGetData() {
var promise = firebase.database().ref('/path/to/data').once('value');
return promise;
}
fbGetData().then(snapshot => console.log(snapshot.cal());
由于使用的是
once()
,因此此代码段中的值最多只能打印一次 正如@jornsharpe评论的那样:Firebase从其异步服务器检索数据。您的浏览器不会等待此结果,因为这会阻止用户执行其他操作。因此,您无法从fbGetData
返回数据,因为它尚未加载
使用异步加载有两种方法:
fbGetData() {
firebase.database().ref('/path/to/data').on('value',(snapshot) => {
this.data = snapshot.val();
console.log(this.data);
})
}
fbGetData();
因此,日志记录现在完全在on()
回调中
当然,您可能希望在不同的时间对数据执行不同的操作,因此可以将回调传递到fbGetData()
:
当然,在这个阶段,你应该考虑如果你不应该简单地用快照调用你自己的回调:
fbGetData(callback) {
firebase.database().ref('/path/to/data').on('value',callback);
}
fbGetData(data => console.log(data.val()));
还愿
在上面的示例中,当数据最初从服务器加载时以及服务器上的数据发生更改时,将打印数据。这是Firebase数据库魔力的一部分:它同步当前值和对该值的任何更改
如果只关心当前值,还可以使用once()
。此方法可以接受回调,但也可以返回承诺。这意味着您可以从fbGetData
返回一些内容:
fbGetData(callback) {
firebase.database().ref('/path/to/data').on('value',(snapshot) => {
this.data = snapshot.val();
callback(this.data);
})
}
fbGetData(data => console.log(data));
fbGetData() {
var promise = firebase.database().ref('/path/to/data').once('value');
return promise;
}
fbGetData().then(snapshot => console.log(snapshot.cal());
由于使用的是
once()
,因此此代码段中的值最多只能打印一次 您可以尝试使用subscribe方法获取数据。可以订阅、映射和转换为JSON
看一下代码,看看你是否能得到一些东西
public sessions(): any {
return this.http.get('api/ResultsAPI') //.get('api/vehicles.json')
.map(
(response: Response) => <any>response.json())
.do
(
response => response
);
}
您可以尝试subscribe方法来获取数据。可以订阅、映射和转换为JSON 看一下代码,看看你是否能得到一些东西
public sessions(): any {
return this.http.get('api/ResultsAPI') //.get('api/vehicles.json')
.map(
(response: Response) => <any>response.json())
.do
(
response => response
);
}
fbGetData
是异步的,它不返回数据。fbGetData
是异步的,它不返回数据。我知道我现在哪里出错了。非常感谢您抽出时间帮助我了解我现在的错误所在。非常感谢你抽出时间来帮忙