首页 > 解决方案 > JavaScript WebSocket 用新套接字替换引用

问题描述

我正在尝试使用函数自动重新连接 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对象转移到旧变量。

标签: javascriptwebsocket

解决方案


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

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

一种更简洁的方法是定义一个私有class/function范围的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

推荐阅读