NodeJS:client.emit('message')在连接后需要延迟才能看到

时间:2017-04-06 14:48:40

标签: javascript node.js socket.io

我在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,因为它听起来不像这里应该要求的东西。

1 个答案:

答案 0 :(得分:2)

Node是异步单线程运行时,因此它使用回调来避免阻塞I / O.

使用setTimeout是一种方式(以及用process.nextTick()方法构建的节点来处理异步代码!)。您的示例代码正在尝试访问clients,我怀疑在执行连接回调之前尚未初始化的任何处理。

setTimeout方法基本上将代码(回调函数)推送到事件队列,因此在此setTimeout回调可以运行之前,将在处理当前在调用堆栈上的任何内容。