【发布时间】:2020-07-18 10:38:55
【问题描述】:
我在 Firebase 实时数据库中有一组项目。客户端订阅数据库的/items 路径中的修改。但这具有每次添加、更新或删除单个项目时将所有项目发送到客户端的效果。这可能是多达 1000 个项目被发送到客户端,因为项目文本已被更新为只有 一个 字符。
此代码有效,但不符合我的要求:
export const startSubscribeItems = () => {
return (dispatch, getState) => {
return new Promise(resolve => {
database.ref('items')
.orderByChild(`members/${uid}`)
.equalTo(true)
.on('value', (snapshot) => {
let items = []
snapshot.forEach( (childSnap) => {
const id = childSnap.key
const item = {id, ...childSnap.val()}
items.push(item)
})
dispatch(setItems(items))
resolve()
})
})
}
}
我希望通过仅发送已更新的项目来提高网络成本效益 - 同时保持客户订阅。
我最初的想法是为每个项目实现订阅:
export const startSubscribeSingleItems = () => {
return (dispatch, getState) => {
return new Promise(resolve => {
database.ref('items')
.orderByChild(`access/members/${uid}`)
.equalTo(true)
.once('value', (snapshot) => {
let items = []
snapshot.forEach( (childSnap) => {
const id = childSnap.key
const item = {id, ...childSnap.val()}
items.push(item)
// .:: Subscribe to single item node ::.
database.ref(`items/${id}`).on('value', (snap)=>{
// Some logic here to handle updates and deletes (remove subscription)
})
})
dispatch(setItems(items))
resolve()
})
})
}
}
这似乎有点麻烦,而且只处理更新和删除。它不处理其他客户添加的情况。添加必须通过单独的数据库节点(例如'subscriptionAdditions//')进行?此外 - 初始加载必须清除“subscriptionAdditions//”中的所有项目,因为第一次加载会读取所有项目。
再次,麻烦。 :/
总之;是否有一种简单和/或推荐的方法来实现在考虑多个客户的同时订阅单个项目?
亲切的问候 /K
【问题讨论】:
标签: javascript node.js firebase-realtime-database subscription