Динамические объекты Websocket с помощью JavaScript

#javascript #websocket

#javascript #websocket

Вопрос:

Я хочу открыть различное количество веб-сокетов, каждый из которых подключается к другому серверу. Я сохраняю объекты в массиве и назначаю их всем одним и тем же обработчикам событий.

 for (var i = 0; i < servers.length; i  ) {
    var wsUri = constructWebSocketURI(servers[i], port);
    var currentWebSocket = new WebSocket(wsUri);

    currentWebSocket.onopen = function (evt) { onOpen(evt) };
    currentWebSocket.onclose = function (evt) { onClose(evt) };
    currentWebSocket.onmessage = function (evt) { onMessage(evt) };
    currentWebSocket.onerror = function (evt) { onError(evt) };

    WebSocketsArr.push(ws);
}
 

Но как я могу различать их внутри обработчиков событий ( onMessage и onError т.д.)?

Ответ №1:

Вы можете изменить свои функции обработчика, чтобы получить дополнительный параметр для имени сервера (или любое другое значение), а затем просто передать другой параметр своим обработчикам при регистрации websockets. Вам просто нужно позаботиться о создании правильного замыкания вокруг значения, которое вы хотите использовать в качестве дискриминатора, что-то вроде:

 var createFunc = function (handlerToCall, discriminator) {
    return function(evt) {
        handlerToCall(evt, discriminator);
    };
}

for (var i = 0; i < servers.length; i  ) {
    var wsUri = constructWebSocketURI(servers[i], port);
    var currentWebSocket = new WebSocket(wsUri);
    var currentServerName = "server_"   i; // or whatever

    currentWebSocket.onopen = createFunc(onOpen, currentServerName);
    currentWebSocket.onclose = createFunc(onClose, currentServerName);
    currentWebSocket.onmessage = createFunc(onMessage, currentServerName);
    currentWebSocket.onerror = createFunc(onError, currentServerName); 

    WebSocketsArr.push(currentWebSocket);
}