收藏
回答

怎么在路由切换时保持websocket连接不中断?

现在有一个业务场景是订单下发成功后,我会和后台建立socket连接,等待后台推送有人接单的消息,接到消息后断开socket连接,目前我的socket代码写在当前页面中,如果等待过程中返回上一级或者跳转路由就会断开socket连接,我想知道有没有一种办法可以把这个socket定义在全局,即连接成功后在所有页面都可以保持连接?建立socket的过程能定义在app.js中吗,如果定义在app.js中,在接到推送消息是该怎么处理业务逻辑呢?

回答关注问题邀请回答
收藏

5 个回答

  • 微喵网络
    微喵网络
    2021-07-06

    肯定是定义在全局做处理啊,鬼知道用户会去哪个页面

    相关代码:

    要引入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)
            ...
        },
        ...
    })
    
    2021-07-06
    有用 1
    回复 7
    • .
      .
      2021-07-06
      我在全局定义一个ScoketTask对象,但是建立连接的方法是写在全局还是业务代码中啊?需要在onMessage中写一些业务逻辑
      2021-07-06
      回复
    • 微喵网络
      微喵网络
      2021-07-06回复.
      我是连接、接收消息都写在app.js中,收到消息后再把消息转发到页面,实际用到消息的页面接收消息做后续处理
      2021-07-06
      回复
    • .
      .
      2021-07-06回复微喵网络
      好的  谢谢  我按这个思路来做一下
      2021-07-06
      回复
    • 微喵网络
      微喵网络
      2021-07-06回复.
      要代码吗?我现在正好git还开着
      2021-07-06
      1
      回复
    • .
      .
      2021-07-06回复微喵网络
      那太感谢了  求参照哈哈
      2021-07-06
      回复
    查看更多(2)
  • 卡卡
    卡卡
    2021-07-06

    我觉得会,你自己测试一下,所有小程序js运行在同一个环境,你不在页面销毁的时候关闭socket,那就会一直接收到消息,只不过你可能不能使用当前页面对象

    2021-07-06
    有用 1
    回复
  • 摇曳的狗尾巴草
    摇曳的狗尾巴草
    2021-12-08

    楼主,你是怎么解决的啊,我也是定义在全局,但是还是会自动关闭,进到聊天页面检查状态重连也不行,还是会莫名其妙的自动关闭

    2021-12-08
    有用
    回复
  • 牵着狗狗看MM
    牵着狗狗看MM
    2021-07-06

    socket定义在全局

    2021-07-06
    有用
    回复 1
    • .
      .
      2021-07-06
      把socket对象定义在全局解决,非常感谢!
      2021-07-06
      回复
  • .
    .
    2021-07-06

    如果我在app.js中定义ScoketTask对象,在其他页面中建立连接并赋予message和close等方法,如果切换到其他页面后后台给我推送消息,还会触发message和close等方法吗?

    2021-07-06
    有用
    回复 2
    • 卡卡
      卡卡
      2021-07-06
      我觉得会,你自己测试一下,所有小程序js运行在同一个环境,你不在页面销毁的时候关闭socket,那就会一直接收到消息,只不过你可能不能使用当前页面对象
      2021-07-06
      回复
    • .
      .
      2021-07-06回复卡卡
      把socket对象定义在全局解决,非常感谢!
      2021-07-06
      回复
登录 后发表内容