javascript node.js sockets

Calling socket.disconnect in a forEach loop doesn’t actually call disconnect on all sockets

I am new to javascript world. Recently I was working on a chat application in nodejs. So I have a method called gracefulshutdown as follows.

var gracefulShutdown = function() {"Received kill signal, shutting down gracefully.");
server.close();'Disconnecting all the clients');
if (Object.keys(io.sockets.sockets).length == 0) process.exit();
var _map = io.sockets.sockets,
for (var _k in _map) {
if (_map.hasOwnProperty(_k)) {
_socket = _map[_k];
...code here...
setTimeout(function() {
logger.error("Could not close connections in time, shutting down");
}, 10 * 1000);

Here is what is happening in the disconnect listener.The removeDisconnectedClient method simply updates an entry in the db to indicate the removed client.

socket.on(‘disconnect’, function() {

So in this case the disconnect event wasn’t fired for all sockets. It was fired for only a few sockets randomly from the array. Although I was able to fix it using setTimeout(fn, 0) with the help of a teammate.

I read about it online and understood only this much that setTimeout defers the execution of of code by adding it to end of event queue. I read about javascript context, call stack, event loop. But I couldn’t put together all of it in this context. I really don’t understand why and how this issue occurred. Could someone explain it in detail. And what is the best way to solve or avoid them.