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
части, которая обрабатывает фактическую связь. Однако он не говорит, почему нет. Возможно, это потому, что первое событие все еще отправляется, но это только догадка с моей стороны.
Использование 'volatile' _does_ означает, что сообщения могут быть удалены по любой причине ... – robertklep
Hum ... Да, но как это могло быть связано с моей проблемой? –
Я могу себе представить, что, в зависимости от того, какой транспорт используется, волатильные сообщения не все могут быть доставлены при отправке быстро. Вы пытались использовать «обычные» сообщения? – robertklep