javascript - JS SocketIO 单例

标签 javascript sockets ecmascript-6

我正在使用套接字 io,并且想应用单例模式以便在不同文件之间保持相同的套接字实例

main.js 和 device.js 都在移动设备上加载,但有不同的套接字实例

主.js :

import ioInstance from './socket'    
console.log(ioInstance)

Device.js :

import ioInstance from './socket'
console.log(ioInstance)

套接字.js :

import io from 'socket.io-client'
export const ioInstance = io('http://192.168.1.15:1337')

我已经尝试了很多方法来做到这一点,但我总是有不同的套接字实例......

有人知道如何做对吗?谢谢

最佳答案

您实际的单例代码根本不是作为单例运行的。当你有这个时:

const socketConnection = {
  _instance: null,
  get instance () {
    if (!this._instance) {
      this._instance = {
        setConnection () {
          return io('http://192.168.0.11:1337')
        },
      }
    }
    return this._instance
  }
}

你引用的是:

socket.instance.setConnection()

每次引用 setConnection() 时调用 io('http://192.168.0.11:1337'),即使 this._instance 已经设置好了。那就是问题所在。相反,您需要在 instance 中保存或缓存调用 io('http://192.168.0.11:1337') 的结果,这样您只能调用一次.


您可以通过更改为以下内容来修复它:

const socketConnection = {
  _instance: null,
  get instance () {
    if (!this._instance) {
      this._instance = io('http://192.168.0.11:1337');
    }
    return this._instance;
  }
}

然后,仅使用它来引用单例套接字:

import socket from './socket'
console.log(socket.instance);
socket.instance.on(...);

你也可以简化事情,只需要这样:

import io from 'socket.io-client'

const socketConnection = io('http://192.168.0.11:1337');

export default socketConnection;

然后,只需使用它来引用单例套接字:

import socket from './socket'
console.log(socket);
socket.on(...);

仅供引用,如果您在原始问题中显示了实际的单例代码,我们可能会在发布您的问题后几分钟内解决这个问题。在这里展示您的实际代码总是比尝试编写伪代码示例更好,因为问题通常与您想象的不完全一样,因此我们需要查看真实代码以确定实际解决方案。

关于javascript - JS SocketIO 单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47964655/

相关文章:

javascript - 如何测量使用 CSS3 变换缩放的 HTML 元素的高度?

javascript - 使用 jquery 为 SVG 的填充设置动画?

sockets - FIN_WAIT2 状态是否曾经由于关闭连接发起者而出现?

javascript - 多种引用导出属性方式的区别

javascript - 按名称从数组中删除元素

javascript - 为什么我看不到提交按钮; IE 上的复选框和 div

javascript - 脚本 438 : Object doesn't support property or method 'circular'

sockets - 为什么在从 Unix 套接字读取时使用 netcat 发送 ^D 不会触发 EOF?

javascript - MutationObserver 检查项目从 DOM 中出现或消失

javascript - ES6 中箭头函数内的参数列表周围的括号是什么意思?