我想创建一个提供程序,它是我的应用和Firebase之间的唯一接口。
我是新手,如果我做错了什么可怕的事情,我很抱歉。我想做的是每次某个值发生变化时,在我的FirebaseProvider 之外调用一个函数。
FirebaseProvider:
onUpdateLobby(key){
return new Promise((resolve,reject)=>{
firebase.database().ref("/games").child(key).on('value',(snap)=>{
console.log("update");
if(snap) resolve(snap.val());
else reject(Error("onUpdateLobby Error"));
});
});
}
测试页
this.db.onUpdateLobby('test').then((snap) => {
console.log(snap);
// do stuff with the data
}).catch((err) => {
console.log(err);
});
在我的测试页面中,我想在每次更改某些内容时 Console.Log 整个对象,这可能吗?(我想通过我的提供商与 Firebase 通信(
更改值 3 次后,我的控制台如下所示:
- 更新(来自提供商(
- asdasdasd(来自TestPage(
- 更新(来自提供商(
- 更新(来自提供商(
- 更新(来自提供商(
谢谢!
正如我的评论中提到的。我认为你遇到的问题是你回报的是一个承诺而不是一个EventEmitter
。请改为尝试以下代码。
Firebase 提供商:
lobbyChanges = new EventEmitter<string>;
onUpdateLobby(key){
firebase.database().ref("/games").child(key).on('value',(snap)=>{
console.log("update");
if (snap) this.lobbyChanges.emit(snap.val());
else this.lobbyChanges.error(Error("onUpdateLobby Error"));
});
}
测试页:
this.db.lobbyChanges.subscribe(
(snap) => {
console.log(snap);
// do stuff with the data
(err) => {
console.log(err);
});
this.db.onUpdateLobby('test')
我认为这是实现您想要的一种方法。
在FirebaseProvider
中创建一个公共函数(listenToGamesNode()
(,该函数将回调函数与子节点键一起作为参数。此函数注册侦听器,并在节点更改时调用提供的回调。
stopListeningToGamesNode()
函数删除侦听器。
FirebaseProvider:
export class FirebaseProvider{
private gamesRef:any;
constructor(){
this.gamesRef = firebase.database().ref('games');
}
listenToGamesNode(key, callback){
this.gamesRef.child(key).on('value', callback);
}
stopListeningToGamesNode(key){
try{
this.gamesRef.child(key).off('value');
}
catch(e){
// Handle error
}
}
}
然后在测试页组件中,注入FirebaseProvider
.使用生命周期事件ionViewWillEnter
开始侦听,ionViewWillLeave
停止侦听节点。
测试页:
export class TestPage{
private key:string = 'test';
constructor(private firebaseProvider: FirebaseProvider){}
ionViewWillEnter(){
this.firebaseProvider.listenToGamesNode(this.key, this.callback);
}
ionViewWillLeave(){
this.firebaseProvider.stopListeningToGamesNode(this.key);
}
private callback(snapshot){
if(snapshot.exists()){
console.log(snapshot.val());
}
else{
// Handle missing node
}
}
}