Firebase数据库:如何解决Promise并继续收听Firebase数据库更改

时间:2018-04-16 10:36:40

标签: javascript firebase firebase-realtime-database

我有2个函数如下,我们1执行一些逻辑,另一个读取Firebase数据库,并继续使用.on()方法监听更改。

  readDB(path): Promise<any>  {
    return new Promise((resolve, reject) => {
      firebase.database().ref(path).on('value', (snapshot) => {
      return resolve(snapshot);
        });
      });
    }

NgOnInit() {
  this.readDB(path).then((snap) => {
    this.viewVariable = snap.val().
  });
}
manipulationMethod(newData, path) {
  firebase.database().ref(path).update(newData);
}

目标是阅读和收听Firebase数据库更改,并在通过第二种方法写入新数据时实时更新接口。

问题:当我返回一个已解决的promise时,.on()监听被终止,它不再监听数据库更改。我必须使用Promises(因为我有很多异步函数)。

问题:有没有办法解决承诺并保持监听功能?比如,返回“订阅”或类似的东西?

2 个答案:

答案 0 :(得分:2)

初始化Firebase对象后,只需将侦听器附加到需要观察的引用,并将其放在函数之外。它应该是这样的:

// fb listener

// where to watch
const myRef = 'ressource/path'
const myDb = firebase.database()
const refToWatch = myDb.ref(myRef)

// the actual listener
refToWatch.on('child_changed', snapshot => {
  const s = snapshot.val()
  console.log(JSON.stringify(s))
})

有关详细信息,请参阅official docs

答案 1 :(得分:1)

根据定义,Promise只解析一次。当您想要使用Firebase中的数据返回承诺时,您将使用once()代替on()

如果另一方面想要返回值流,则使用on并返回面向流的数据类型。这些天的典型类型是RxJS Observable。有关将on()转换为可观察对象的单个示例,请参阅Chris Esplin的this gist

Rx.Observable.fromEvent(ref, 'child_added').subscribe(function (snap) {
  console.log('child_added', snap.key);
});

因此,这会创建一个child_added事件的可观察对象,然后订阅该可观察对象,并打印它所获得的每个事件。