688
社区成员
发帖
与我相关
我的任务
分享| 这个作业属于哪个课程 | 2023年福大-软件工程实践-W班 |
|---|---|
| 这个作业要求在哪里 | 软件工程实践总结&个人技术博客 |
| 这个作业的目标 | 总结心得、回顾并思考过去提出的问题、自我评估、完成个人技术博客 |
| 其他参考文献 | 相关链接置于文末 |
在小程序中实现聊天功能,或者是在游戏中与队友的游戏数据保持一致,等等这些都是通过数据实时推送进行的。因此需要实时监听集合中的数据条数。
专业的的聊天IM整合和改造难度较大,免费版本使用受限较多,监听数据库集合是简便省力的平替方法,代码可维护性强。
Collection.watch方法类似于vue的watch方法,学习成本低。
有时候要对具有相同查询条件的不同字段的不同变化执行不同的回调函数,而相同的监听器只允许存在一个(监听器一般声明类型为const,并且需要在onUnload周期函数中关闭监听器,监听器重名会导致一系列问题),因此如何将不同动作编写在同一个回调函数中是一个难点。
Collection.watch(options: Object): Object
const db = wx.cloud.database()
const watcher = db.collection('todos')
// 按 progress 降序
.orderBy('progress', 'desc')
// 取按 orderBy 排序之后的前 10 个
.limit(10)
// 筛选语句
.where({
// 填入当前用户 openid,或如果使用了安全规则,则 {openid} 即代表当前用户 openid
_openid: '{openid}'
})
// 发起监听
.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)
}
})
编写合适的条件判断语句来区分要执行的代码。为举例方便,假设有一集合的记录内容类型均如下:
{
name:'张三',
age:18,
school:'FZU'
}
1. 确定更新事件的类型
使用snapshot.docChanges[0].dataType==DataType枚举值来确定本次监听到的事件类型,如只需要在初始化时执行的代码,则可以写snapshot.docChanges[0].dataType=="init" ,docChanges[0].dataType一般不会为undefined,不需要额外判断。
2. 确定被更新的字段
当监听的记录同时只改变一个字段时:docChanges[0].updatedFields的返回值为一个键值对 (改变的字段名,改变后的值) 。
使用Object.keys(snapshot.docChanges[0].updatedFields)=='age' 判断改变的字段是否为age。其中Object.keys用于得到返回键值对的键(上例中为age)。
当监听的记录同时会改变多个字段时:docChanges[0].updatedFields的返回值为一个键值对数组。
使用in运算符判断这多个字段的键是否在返回数组中。如if('name'&&'school' in snapshot.docChanges[0].updatedFields),用来判断监听到变化的字段是否为name和school。
3. 示例:
//onLoad中
watcher=db.collection('user_record')
.where({
status:true,
game_record_id:this.data.game_record_id
})
.watch({
onChange:(snapshot)=>{
console.log('watcher3 snapshot',snapshot);
//当监听到更新的字段为isReady时
if(snapshot.docChanges[0].dataType=="update"&&Object.keys(snapshot.docChanges[0].updatedFields)=='isReady'){
// 直接修改当前Page的data变量
this.setData({
players2:snapshot.docs
})
console.log('players2:',this.data.players2);
}
//当更新的字段中包含status时
if (snapshot.docChanges[0].dataType=="update"&& 'status' in snapshot.docChanges[0].updatedFields){
//调用业务函数
wx.cloud.callFunction({
name:'getUserList',
data:{
game_record_id:this.data.game_record_id
}
})
// 用快照数组修改当前Page的data变量
this.setData({
players2:snapshot.docs
})
}
},
onError:(e)=>{
console.log('error',e);
}
})
// onUnload中
watcher.close();
监听器一般放在onLoad中实现,所以应将监听器声明为当前页面的全局常量,这样才能在onUnload中正常关闭监听器。
使用 watch 时,支持 where, orderBy, limit,不支持 field。
调式基础库需要在2.9.2版本以上。