#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);
}