之前做的两个项目都涉及到即时通讯功能,近期帮朋友开发小程序时也有这个需求,因为没有后端,所以决定使用云开发来实现通讯功能。
即时通讯的关键点在于即时,在之前的开发中我们可以通过websocket长连接来实现,云开发又怎样来完成这项功能呢?
通过查阅小程序官方文档,我们发现collection.watch()方法可以实现数据监听,官方说明为:
监听集合中符合查询条件的数据的更新事件。使用 watch 时,支持 where, orderBy, limit,不支持 field。
这样一来我们边可以通过wach方法监听指定聊天室的数据更新(将A B用户的聊天关系记录为一条聊天室数据,通过id进行唯一标识)
具体代码如下:
1 // 监听数据变化 2 let _db = db.collection(\'msgList\') 3 _db 4 .where({id: this.data.id}) 5 .watch({ 6 // 成功回调 7 onChange: function(snapshot) { 8 let reviceMsg = snapshot.docChanges[0] 9 if(reviceMsg.dataType == \'add\'){ 10 console.log(reviceMsg.doc) 11 let talkData = that.data.talkData 12 talkData.push(reviceMsg.doc) 13 that.setData({ 14 talkData: talkData 15 }) 16 } 17 }, 18 // 失败回调 19 onError: function(err) { 20 console.error(\'the watch closed because of error\', err) 21 } 22 })