JavaScript WebSocket使用新套接字替换引用

JavaScript WebSocket使用新套接字替换引用,javascript,websocket,Javascript,Websocket,我正在尝试使用函数自动重新连接websocket。 我希望它保持相同的变量名,但我有一些问题。 这是我正在使用的函数 function reconnect(obj){ try{ obj=new WebSocket(obj.url); } except{ setTimeout(reconnect,5000,obj); } } mysocket=new Websocket(myurl); mysocket.close() r

我正在尝试使用函数自动重新连接websocket。 我希望它保持相同的变量名,但我有一些问题。 这是我正在使用的函数

function reconnect(obj){
    try{
        obj=new WebSocket(obj.url);
        }
     except{
        setTimeout(reconnect,5000,obj);
    }
}

mysocket=new Websocket(myurl);
mysocket.close()
reconnect(mysocket)

重新连接功能成功运行后,
mysocket
仍引用旧的已关闭
Websocket
。我不知道如何将新的
Websocket
对象转换为旧变量

您正在重写该变量。有多种方法可以做到这一点,最快的方法是传递一个对象

function reconnect(obj){
    var mySocket = obj.mySocket;
    try {
        obj.mySocket=new WebSocket(mySocket.url);
    }
    except {
        setTimeout(reconnect, 5000, obj);
    }
}

mysocket=new Websocket(myurl);
mysocket.close()
var wrapperObject = {mysocket};
reconnect(wrapperObject);
// At any point of time `wrapperObject.mysocket` will have the latest socket instance
一种更简洁的方法是定义一个包装器
类/函数
,它私有地限定
mySocket
变量的范围。例:

function ReconnectSocket (mySocket) {
    this.mySocket = mySocket
}

ReconnectSocket.prototype.reconnect = function () {
    try {
        this.mySocket = new WebSocket(this.mySocket.url);
    }
    except {
        setTimeout(reconnect, 5000);
    }
}

ReconnectSocket.prototype.getSocket = function () {
    return this.mySocket
}

var mysocket=new Websocket(myurl);
mysocket.close()
var reconnectSocket = new ReconnectSocket(mysocket).reconnect()
// `reconnectSocket.getSocket()` will give the latest instance at any point of time

第一种方法是使用全局变量

    function reconnect(){
        try{
            mysocket=new WebSocket(mysocket.url);
            }
         except{
            setTimeout(reconnect,5000);
        }
    }

    mysocket=new Websocket(myurl);
    mysocket.close()
    reconnect()
第二种方法,我认为应该将套接字包装在一个对象中

    function reconnect(obj){
        try{
            obj.mysocket=new WebSocket(obj.mysocket.url);
            }
         except{
            setTimeout(reconnect,5000,obj);
        }
    }

    var socketObject = {};
    socketObject.mysocket=new Websocket(myurl);
    socketObject.mysocket.close()
    reconnect(socketObject)

第二种方法将抛出一个错误,
socketObject
尚未初始化为对象。我考虑过您的第一个版本,但是如果它在第一次通过时失败,并使用
setTimeout
将它分配给
mysocket
?@jeffpkamp,我不确定您的评论,因为我没有您的测试环境。然而,我认为如果它在与Websocket本身相关的第一个旁路问题上失败,它也可能在
setTimeout
上失败,但这与代码逻辑无关。这一切都与您的
Websocket
初始化有关。你最好测试一下,看看哪个适合你