我想创建一个提供程序,它是我的应用程序和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"));
});
});
}
Testpage
this.db.onUpdateLobby('test').then((snap) => {
console.log(snap);
// do stuff with the data
}).catch((err) => {
console.log(err);
});
在我的TestPage中我想控制台。每次更改内容时都记录整个对象,这是否可能? (我想通过我的提供商与Firebase沟通)
将值更改为3次后,我的控制台如下所示:
谢谢!
答案 0 :(得分:2)
正如我的评论所述。我认为您遇到的问题是您返回的是承诺而不是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"));
});
}
<强> TestPage:强>
this.db.lobbyChanges.subscribe(
(snap) => {
console.log(snap);
// do stuff with the data
(err) => {
console.log(err);
});
this.db.onUpdateLobby('test')
答案 1 :(得分:1)
我认为这是达到你想要的一种方式。
在listenToGamesNode()
中创建一个公共函数(FirebaseProvider
),它将回调函数作为参数与子节点键一起使用。此函数注册一个侦听器,并在更改节点时调用提供的回调。
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
}
}
}
然后在TestPage组件中注入FirebaseProvider
。使用生命周期事件ionViewWillEnter
开始监听,ionViewWillLeave
停止收听节点。
<强> TestPage:强>
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
}
}
}