Ionic Firebase Promise,每次Value更改时调用一个函数

时间:2017-07-17 15:24:32

标签: angular typescript firebase firebase-realtime-database ionic2


我想创建一个提供程序,它是我的应用程序和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次后,我的控制台如下所示:

  • 更新(来自提供商)
  • asdasdasd (来自TestPage)
  • 更新(来自提供商)
  • 更新(来自提供商)
  • 更新(来自提供商)

谢谢!

2 个答案:

答案 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
        }
    }
}