2015-02-22 2 views
1

Я пытаюсь реализовать простую блокировку, используя следующий код:Socket.io: получить событие запуска несколько раз

Сервер:

socket.on('lock', function(ressInfo) 
{ 
    var lock = false; 
    if(ressLocks.indexOf(ressInfo.id) === -1) 
    { 
    ressLocks.push(ressInfo.id); 
    lock = true; 
    } 
    socket.emit("lock", lock); 
}); 

Клиент:

this.requestLock = function(ressInfo, callback) 
{ 
    if(currentlyOnline) 
    { 
    socket.emit("lock", ressInfo); 

    socket.on("lock", function(lock) 
    { 
     // this gets triggered one additional time with each lock 
     callback(lock); 
    }); 
    } 
    else 
    { 
    callback(true); 
    } 
} 

На первый звонок Я получаю один обратный вызов с true, при втором вызове я получаю два обратных вызова с false, на третьем вызове три и т. д.

Что здесь происходит? Почему socket.on вызывается несколько раз?

ответ

0

Я думаю, по двум причинам:

сторона клиента:

  • Если вы регистрируетесь для функции блокировки множественного времени сторона

Сервера:

  • Как я предположим, что это происходит, если вы регистрируетесь несколько раз, чтобы прослушивать события, предполагающие, что yo u запускают функцию socket.on каждый раз, когда вы получаете события

Вот как вы можете отлаживать.

Установите узел-отлаживать

сделать узел-отладки "имя файла"

Это откроется в режиме отладки. Теперь проверьте, сколько раз регистрируется socket.on для «блокировки». У меня была аналогичная проблема. Вот как я это решил.

//check if msgtype is already binded  
if (!isMessageTypeBinded(msgType, someKey)) { 
     // emit ot connection 
     io.of(someKey).emit(msgType, message) 
     return 
    } else { 
     // apply filter to all connection 
     var sockets = io.of(someKey).sockets 
     if (msgType) { // check for message tye 
      activeMsgConn.push({ 
       "msgType": msgType, 
       "accessKey": someKey 
      }) 
      for (index in sockets) { 
       var socket = sockets[index] 
       socket.on(msgType, notifyNewMsg(socket)) 
       io.of(someKey).emit(msgType, message) 
      } 
     } 
    } 

Я поддерживаю массив всех соединений, выполненных до сих пор.

Если появляется новый msg, я сначала проверю, был ли этот msg уже привязан к сокету и не добавил никакого нового пространства имен. Else i loop полностью подключает к разъему и добавляет этот обработчик.

В вашем случае код не должен быть таким же, но реализация может быть аналогичной.

Смежные вопросы