现在有一个业务场景是订单下发成功后,我会和后台建立socket连接,等待后台推送有人接单的消息,接到消息后断开socket连接,目前我的socket代码写在当前页面中,如果等待过程中返回上一级或者跳转路由就会断开socket连接,我想知道有没有一种办法可以把这个socket定义在全局,即连接成功后在所有页面都可以保持连接?建立socket的过程能定义在app.js中吗,如果定义在app.js中,在接到推送消息是该怎么处理业务逻辑呢?
网友回复
微喵网络:
肯定是定义在全局做处理啊,鬼知道用户会去哪个页面
相关代码:
要引入mitt.js,百度一下,一个很小的文件
app.js
const mitt = require('./utils/mitt').mitt
...
App({
...
onLaunch: function () {
let that = this
that.globalData.bus = mitt()
...
//连接socket
...
//收到消息的回调中
if (msg.length > 0) {
that.globalData.bus.emit('_socketMsg', msg)
}
...
}
...
})
要用到消息的页面
const app = getApp()
...
Page({
...
socketMsg: function(msg){
//实际处理收到的消息
},
onShow: function () {
let that = this
app.globalData.bus.on('_socketMsg', that.socketMsg)
...
},
onHide: function () {
let that = this
app.globalData.bus.off('_socketMsg', that.socketMsg)
...
},
...
})
卡卡:
我觉得会,你自己测试一下,所有小程序js运行在同一个环境,你不在页面销毁的时候关闭socket,那就会一直接收到消息,只不过你可能不能使用当前页面对象
牵着狗狗看MM:
socket定义在全局
.:
如果我在app.js中定义ScoketTask对象,在其他页面中建立连接并赋予message和close等方法,如果切换到其他页面后后台给我推送消息,还会触发message和close等方法吗?