微信《小程序·云》實時數(shù)據(jù)推送支持實時推送變更數(shù)據(jù)的能力
微信《小程序·云》實時數(shù)據(jù)推送支持實時推送變更數(shù)據(jù)的能力【珠海微信小程序定制開發(fā)電話】為了進(jìn)一步提高在即時通信、實時數(shù)據(jù)更新和推送等場景下的開發(fā)效率,小程序·云開發(fā)新增實時數(shù)據(jù)推送能力。開發(fā)者在小程序端給定查詢條件后,每當(dāng)查詢結(jié)果發(fā)生變更時,小程序可收到一個更新事件,實時獲取更新內(nèi)容。實時數(shù)據(jù)推送可被廣泛地應(yīng)用于棋牌類等回合制小游戲、在線協(xié)作文檔以及團(tuán)隊任務(wù)管理等場景。
微信《小程序·云》實時數(shù)據(jù)推送支持實時推送變更數(shù)據(jù)的能力
介紹
云開發(fā)數(shù)據(jù)庫支持實時推送變更數(shù)據(jù)的能力,給定查詢條件,每當(dāng)數(shù)據(jù)庫更新而導(dǎo)致查詢條件對應(yīng)的查詢結(jié)果發(fā)生變更時,小程序可收到一個更新事件,其中可獲取更新內(nèi)容和更新后的查詢結(jié)果快照。
實時數(shù)據(jù)推送有廣泛應(yīng)用場景,此處是一些示例:
聊天/即時通信:小游戲內(nèi)聊天、大廳廣播、區(qū)服廣播等;企業(yè)內(nèi)部小程序中的即時通信能力等
多人小游戲:使用狀態(tài)同步的小游戲,如棋牌類等回合制游戲
協(xié)作工具:如在線協(xié)作文檔、團(tuán)隊任務(wù)管理等
實時應(yīng)用狀態(tài)同步:以信息流為例,可以實時獲取最新文章、以及最新評論、點贊、通知等內(nèi)容,讓交互更順暢自然
監(jiān)聽
調(diào)用 Collection 上的 watch 方法即可監(jiān)聽給定查詢條件對應(yīng)的數(shù)據(jù):
const db = wx.cloud.database() const watcher = db.collection('todos').where({ team: 'our dev team' }).watch({ onChange: function(snapshot) { console.log('docs\'s changed events', snapshot.docChanges) console.log('query result snapshot after the event', snapshot.docs) console.log('is init data', snapshot.type === 'init') }, onError: function(err) { console.error('the watch closed because of error', err) } }) // ... // 等到需要關(guān)閉監(jiān)聽的時候調(diào)用 close() 方法 watcher.close()
onChange 和 onError 是必傳參數(shù)。onChange 用于接收變更快照,onError 用于處理監(jiān)聽錯誤。如果監(jiān)聽發(fā)起失敗或監(jiān)聽過程中出現(xiàn)不可恢復(fù)的錯誤,則會終止監(jiān)聽并通過 onError 拋出異常。onChange 會在第一次監(jiān)聽初始化及后續(xù)數(shù)據(jù)變更時收到推送事件。第一次初始化時會收到的查詢條件對應(yīng)的查詢結(jié)果(此處不會有默認(rèn) 20 條上限,包含集合中所有滿足查詢條件的記錄),后續(xù)變更事件會包含變更內(nèi)容和變更后的查詢結(jié)果快照。
onChange 收到的 snapshot 變更快照中帶有如下字段:
字段 | 類型 | 說明 |
---|---|---|
docChanges | ChangeEvent[] | 更新事件數(shù)組 |
docs | object[] | 數(shù)據(jù)快照,表示此更新事件發(fā)生后查詢語句對應(yīng)的查詢結(jié)果 |
type | string | 快照類型,僅在第一次初始化數(shù)據(jù)時有值為 init |
id | number | 變更事件 id |
ChangeEvent 記錄變更事件的內(nèi)容包括:
字段 | 類型 | 說明 |
---|---|---|
id | number | 更新事件 id |
queueType | string | 列表更新類型,表示更新事件對監(jiān)聽列表的影響,枚舉值,定義見 QueueType |
dataType | string | 數(shù)據(jù)更新類型,表示記錄的具體更新類型,枚舉值,定義見 DataType |
docId | string | 更新的記錄 id |
doc | object | 更新的完整記錄 |
updatedFields | object | 所有更新的字段及字段更新后的值,key 為更新的字段路徑,value 為字段更新后的值,僅在 update 操作時有此信息 |
removedFields | string[] | 所有被刪除的字段,僅在 update 操作時有此信息 |
DataType 枚舉值
枚舉值 | 說明 |
---|---|
init | 初始化數(shù)據(jù) |
update | 記錄內(nèi)容更新,對應(yīng) update 操作 |
replace | 記錄內(nèi)容被替換,對應(yīng) set 操作 |
add | 記錄新增,對應(yīng) add 操作 |
remove | 記錄被刪除,對應(yīng) remove 操作 |
QueueType 枚舉值
枚舉值 | 說明 |
---|---|
init | 初始化列表 |
update | 列表中的記錄內(nèi)容有更新,但列表包含的記錄不變 |
enqueue | 記錄進(jìn)入列表 |
dequeue | 記錄離開列表 |
變更事件會細(xì)分記錄數(shù)據(jù)變更類型 dataType 和監(jiān)聽列表變更類型 queueType,其可能的搭配和意義如下。
dataType | queueType | 說明 |
---|---|---|
init | init | 監(jiān)聽開始時的初始化數(shù)據(jù) |
update | update | 記錄部分更新,更新后仍在查詢結(jié)果列表中 |
update | enqueue | 記錄部分更新,更新后進(jìn)入查詢結(jié)果列表 |
update | dequeue | 記錄部分更新,更新后離開查詢結(jié)果列表 |
replace | update | 記錄被替換,更新后仍在查詢結(jié)果列表中 |
replace | enqueue | 記錄被替換,更新后進(jìn)入查詢結(jié)果列表 |
replace | dequeue | 記錄被替換,更新后離開查詢結(jié)果列表 |
add | enqueue | 記錄是新增記錄,新增后進(jìn)入查詢結(jié)果列表 |
remove | dequeue | 記錄被刪除,離開查詢結(jié)果列表 |
注意事項與系統(tǒng)限制
監(jiān)聽返回的數(shù)據(jù)不受默認(rèn) 20 條限制
監(jiān)聽返回的數(shù)據(jù)可能超過 20 條,不受小程序端默認(rèn) 20 條上限限制。
監(jiān)聽暫只支持 where 語句
監(jiān)聽暫僅支持 where 語句,不支持 orderBy、limit、field 等語句。
監(jiān)聽記錄數(shù)限制
一次監(jiān)聽的記錄數(shù)上限為 5000,若超出上限會拋錯并停止監(jiān)聽。監(jiān)聽過大量的數(shù)據(jù)時初始化會較慢,對監(jiān)聽效率也有影響,如果預(yù)期監(jiān)聽發(fā)起時少于 5000,但后續(xù)有可能超過 5000,請注意在即將超過時重新監(jiān)聽并保證不超過 5000。
最佳實踐
只監(jiān)聽必要的數(shù)據(jù)
監(jiān)聽時應(yīng)明確查詢條件,只監(jiān)聽必須用到的數(shù)據(jù),避免監(jiān)聽不必要的數(shù)據(jù),以此提高初次加載數(shù)據(jù)的性能以及接收數(shù)據(jù)變更的性能。
掃二維碼手機查看該文章