我有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(因为我有很多异步函数)。
问题:有没有办法解决承诺并保持监听功能?比如,返回“订阅”或类似的东西?
答案 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
事件的可观察对象,然后订阅该可观察对象,并打印它所获得的每个事件。