我正在使用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')
我已经尝试了很多方法,但我总是有不同的套接字实例......
任何人都知道怎么做才对吗?感谢
答案 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(...);
仅供参考,如果您在原始问题中显示实际的单例代码,我们可能会在发布您的问题后几分钟内解决此问题。在这里显示你的实际代码总是比尝试编写伪代码示例更好,因为问题往往不是你想的那么,所以我们需要看到真正的代码来识别实际的解决方案。