小程序
小游戏
企业微信
微信支付
扫描小程序码分享
我使用es6语法暴露一个连接类,然后app.js实例化该连接类,获取wx.connectsocket接口函数的返回值socketTask,将它存储在全局实例app的connectobj属性中实现所有页面共享一个websocket连接,然后直接在页面中使用connectobj调用onmessage监听消息,重复进入后重复执行这个监听函数,导致收到的消息重复写入,请问有什么解决办法么?能不能通过判断onmessage函数是否在执行来解决?如果可以,怎么判断?感谢大佬指点!
2 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
我觉得你可能思路有问题,onmessage应该只设置一次,一个connectobj本来就一直在并没有销毁,你多设置当然就多次触发了,所以可以把onmessage的设置也放到app中,再用回调触发。
// 方案一: // app.js App({ onLaunch: function () { var connectobj = wx.connectSocket({ url: 'ws://xxx:xxxx' }); connectobj.onMessage((data) => { var pages = getCurrentPages(); var currentPage = pages[pages.length - 1]; //当前页面 if (currentPage.onMessage) currentPage.onMessage(data); }); } }) // page.js page({ data: { sData: {} }, onLoad: function () { }, onMessage: function (data) { this.setData({ sData: data }); } }) // 方案二: // app.js App({ onLaunch: function () { var connectobj = wx.connectSocket({ url: 'ws://xxx:xxxx' }); connectobj.onMessage((data) => { if (this.onMessage) this.onMessage(data); }); } }) // page.js const app = getApp(); page({ data: { sData: {} }, onLoad: function () { app.onMessage = (data) => { this.setData({ sData: data }); } }, onUnload: function () { app.onMessage = null; } })
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
感谢大佬,已经按照你的思路成功解决了问题!顺便问一下,如果我在后端将clientid和uid绑定,那么如果下次再绑定,不解绑之前的,是不是就会造成服务端给一个uid发消息会发多次给客户端?
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
我觉得你可能思路有问题,onmessage应该只设置一次,一个connectobj本来就一直在并没有销毁,你多设置当然就多次触发了,所以可以把onmessage的设置也放到app中,再用回调触发。
// 方案一: // app.js App({ onLaunch: function () { var connectobj = wx.connectSocket({ url: 'ws://xxx:xxxx' }); connectobj.onMessage((data) => { var pages = getCurrentPages(); var currentPage = pages[pages.length - 1]; //当前页面 if (currentPage.onMessage) currentPage.onMessage(data); }); } }) // page.js page({ data: { sData: {} }, onLoad: function () { }, onMessage: function (data) { this.setData({ sData: data }); } }) // 方案二: // app.js App({ onLaunch: function () { var connectobj = wx.connectSocket({ url: 'ws://xxx:xxxx' }); connectobj.onMessage((data) => { if (this.onMessage) this.onMessage(data); }); } }) // page.js const app = getApp(); page({ data: { sData: {} }, onLoad: function () { app.onMessage = (data) => { this.setData({ sData: data }); } }, onUnload: function () { app.onMessage = null; } })
感谢大佬,已经按照你的思路成功解决了问题!顺便问一下,如果我在后端将clientid和uid绑定,那么如果下次再绑定,不解绑之前的,是不是就会造成服务端给一个uid发消息会发多次给客户端?