Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS SocketIO singleton_Javascript_Sockets_Ecmascript 6 - Fatal编程技术网

Javascript JS SocketIO singleton

Javascript JS SocketIO singleton,javascript,sockets,ecmascript-6,Javascript,Sockets,Ecmascript 6,我正在使用socket io,并希望应用singleton模式,以便在不同的文件之间保持相同的socket实例 main.js和device.js都是在移动设备上加载的,但具有不同的套接字实例 Main.js: import ioInstance from './socket' console.log(ioInstance) import ioInstance from './socket' console.log(ioInstance) import io from 'socket

我正在使用socket io,并希望应用singleton模式,以便在不同的文件之间保持相同的socket实例

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

Main.js:

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

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

import ioInstance from './socket'    
console.log(ioInstance)
import ioInstance from './socket'
console.log(ioInstance)
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
  }
}
import io from 'socket.io-client'

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

export default socketConnection;
您正在引用:

socket.instance.setConnection()
那就是调用
io('http://192.168.0.11:1337)
每次引用
setConnection()
,即使
此实例已设置。这就是问题所在。相反,您需要在
实例中保存或缓存调用
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;
  }
}
然后,仅使用此引用singleton套接字:

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

您还可以简化问题,只需执行以下操作:

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

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

export default socketConnection;
然后,只需使用它来引用singleton套接字:

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


仅供参考,如果您在原始问题中显示实际的单例代码,我们可能会在发布您的问题后几分钟内解决此问题。在这里展示实际代码总比尝试编写伪代码示例要好,因为问题往往不在您认为的确切位置,因此我们需要查看实际代码以确定实际解决方案。

您的执行环境是什么?浏览器node.js?Electron?我在ubuntu上,用express server和Chrome作为浏览器运行这个程序。这是用ubuntu在node.js中运行的代码,还是这是Chrome浏览器代码?这是我的小应用程序的前端部分确实,我仍然看不到如何应用单例模式在不同的文件中使用相同的实例。除了将套接字连接到Javascript窗口对象之外,还需要做些别的事情。谢谢您的回复。我已经尝试导出一个简单的const,但仍然创建了2个实例(您可以检查我的github分支,根据您的建议进行更新)@Hervé-您是否使用webPack为客户端绑定了它?如果是这样的话,您是否查看了在浏览器中运行的实际生成的代码,以了解它实际上在做什么?我确实在使用webpack。我一看到这样的文章就会看一看,如果你做得好的话,它应该可以工作。问题是因为我编译了两个不同的文件(bundle.js和device.js)。我现在正在编译成一个文件,它正在工作。但我认为这不是一个好方法,因为这意味着我的移动设备也在加载桌面js功能