JS SocketIO单身人士

时间:2017-12-24 23:17:29

标签: javascript sockets ecmascript-6

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

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

Main.js:

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

Device.js:

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

socket.js:

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

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

任何人都知道怎么做才对吗?感谢

1 个答案:

答案 0 :(得分:3)

您的实际单例代码根本不是单例操作。如果你有这个:

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()

即使已设置io('http://192.168.0.11:1337'),每次引用setConnection()时都会调用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(...);

仅供参考,如果您在原始问题中显示实际的单例代码,我们可能会在发布您的问题后几分钟内解决此问题。在这里显示你的实际代码总是比尝试编写伪代码示例更好,因为问题往往不是你想的那么,所以我们需要看到真正的代码来识别实际的解决方案。