我在Node应用程序中使用socket.io
。以下是我的代码片段:
io.sockets.on('connection', socket => {
setTimeout(function () {
console.log('a client connected!')
clients.forEach(s => s.emit('to_client', 'a client connected'))
}, 0)
})
如果我删除setTimeout
包装,则在客户端(Chrome浏览器)的控制台中看不到'a client connected'
,但即使超时为零,它也会显示。可能是什么问题?我宁愿没有setTimeout
,因为它听起来不像这里应该要求的东西。
答案 0 :(得分:2)
Node是异步单线程运行时,因此它使用回调来避免阻塞I / O.
使用setTimeout是一种方式(以及用process.nextTick()方法构建的节点来处理异步代码!)。您的示例代码正在尝试访问clients
,我怀疑在执行连接回调之前尚未初始化的任何处理。
setTimeout方法基本上将代码(回调函数)推送到事件队列,因此在此setTimeout回调可以运行之前,将在处理当前在调用堆栈上的任何内容。