2016-04-26 5 views
3

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

//server 
​ 
_this.nsp.volatile.emit('event1', foo); 
_this.nsp.volatile.emit('event2', bar); 
​ 

//client 
​ 
socket.on('event1', function(data){ 
    //THIS ONE WORK 
    console.log("event1"); 
}); 
socket.on('event2', function(data){ 
    //THIS ONE NOT 
    console.log("event2"); 
}); 

На этом примере event1 будет работать, но не event2.

Если я испущу первый event2, event2 будет работать, но не event1.

Любая идея, как заставить ее работать?

+0

Использование 'volatile' _does_ означает, что сообщения могут быть удалены по любой причине ... – robertklep

+0

Hum ... Да, но как это могло быть связано с моей проблемой? –

+0

Я могу себе представить, что, в зависимости от того, какой транспорт используется, волатильные сообщения не все могут быть доставлены при отправке быстро. Вы пытались использовать «обычные» сообщения? – robertklep

ответ

1

TL; Если вы хотите, чтобы сообщения были отправлены, не используйте volatile.

Использование volatile означает, что сообщения могут быть удалены. Другими словами: вы не можете полагаться на их доставку на всех или в любом конкретном порядке.

Я побежал быстрый тест с кодом, похожее на это:

io.on('connection', (socket) => { 
    socket.volatile.emit('event1', '1'); 
    socket.volatile.emit('event2', '2'); 
}); 

Ни сообщение доставляется (в моей установке, во всяком случае). Причина этого, насколько я могу судить по выводу отладки, заключается в том, что сервер и клиент все еще ведут переговоры о том, какой транспорт использовать при отправке сообщений. Поскольку они нестабильны, сервер не ставит их в очередь, чтобы отправить их после завершения переговоров.

Нечто подобное происходит, когда вы испускаете сообщения после некоторого ожидания:

io.on('connection', (socket) => { 
    setTimeout(() => { 
    socket.volatile.emit('event1', '1'); 
    socket.volatile.emit('event2', '2'); 
    }, 2000); 
}); 

Здесь принимаются первое сообщение, но второй один не является (это, кажется, похожи на вашу ситуацию). В журнале отображается отлаживать это:

socket.io:client writing packet {"type":2,"data":["event1","1"],"nsp":"/"} +1s 
    socket.io-parser encoding packet {"type":2,"data":["event1","1"],"nsp":"/"} +0ms 
    socket.io-parser encoded {"type":2,"data":["event1","1"],"nsp":"/"} as 2["event1","1"] +1ms 
    engine:socket sending packet "message" (2["event1","1"]) +0ms 
    engine:socket flushing buffer to transport +0ms 
    engine:ws writing "42["event1","1"]" +0ms 
    socket.io:client writing packet {"type":2,"data":["event2","2"],"nsp":"/"} +0ms 
    socket.io-parser encoding packet {"type":2,"data":["event2","2"],"nsp":"/"} +0ms 
    socket.io-parser encoded {"type":2,"data":["event2","2"],"nsp":"/"} as 2["event2","2"] +0ms 

От того, что я должен сделать вывод, что второе сообщение является закодированы, но не доставляется в engine.io части, которая обрабатывает фактическую связь. Однако он не говорит, почему нет. Возможно, это потому, что первое событие все еще отправляется, но это только догадка с моей стороны.

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