我正在使用套接字 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/