Я новичок в javascript мире. Недавно я работал над чат-приложением в nodejs. Поэтому у меня есть метод, называемый gracefulshutdown следующим образом.
var gracefulShutdown = function() {
logger.info("Received kill signal, shutting down gracefully.");
server.close();
logger.info('Disconnecting all the socket.io clients');
if (Object.keys(io.sockets.sockets).length == 0) process.exit();
var _map = io.sockets.sockets,
_socket;
for (var _k in _map) {
if (_map.hasOwnProperty(_k)) {
_socket = _map[_k];
_socket.disconnect(true);
}
}
...code here...
setTimeout(function() {
logger.error("Could not close connections in time, shutting down");
process.exit();
}, 10 * 1000);
}
Вот что происходит в отключенном прослушителе. Метод removeDisconnectedClient просто обновляет запись в db, чтобы указать удаленный клиент.
socket.on('disconnect', function() { removeDisconnectedClient (розетка); });
Итак, в этом случае событие разъединения не было запущено для всех сокетов. Он был запущен только из нескольких сокетов из массива. Хотя я смог исправить это с помощью setTimeout (fn, 0) с помощью товарища по команде.
Я прочитал об этом в Интернете и понял только то, что setTimeout отменил выполнение кода, добавив его в конец очереди событий. Я читал о контексте javascript, стекх вызовов, цикле событий. Но я не мог собрать все это в этом контексте. Я действительно не понимаю, почему и как эта проблема возникла. Может кто-нибудь объяснить это подробно. И каков наилучший способ их решить или избежать.