是否socket.io服务器发出callback阻塞?

当在服务器上接收到发射(即,由客户端生成)时,在下一个发射被处理之前,callback函数是否完成?

例:

socket.on('disconnect', function() { log('disconnect START - ' + socket.id); ... ... Do some stuff ... ... log('disconnect END - ' + socket.id); }); 

我似乎在我的日志中得到这个输出:

 disconnect START - z0w0W4scKZ8o6c4nAAAm disconnect END - z0w0W4scKZ8o6c4nAAAm disconnect START - LLnSgRBV9NZ35mjrAAAk disconnect START - djl3hyNvIwAhSEDbAAAn disconnect END - LLnSgRBV9NZ35mjrAAAk disconnect END - djl3hyNvIwAhSEDbAAAn 

正如你所看到的,一个START在达到END之前中断另一个…

Socket.io坚持基于事件循环的asynchronous代码执行的基本原理,当发出和/或监听具有特定名称的事件时,您的每个emitoncallback都会被执行。

由于这些事件都是顺序执行的,所以除非在代码本身中做出这样的安排

  //Server //1. Emit this event socket.emit('First_Event', { hello: 'world' }); //2. Listen to this event socket.on('Synchronous-Event', function (data) { console.log(data); }); //Client //1. Listen to this event socket.on('First_Event', function (data) { console.log(data); //2.Then emit this event socket.emit('Synchronous-Event', { my: 'data' }); }); 

上面的代码确保在客户端监听到“First_Event”之后,客户端的“Synchronous-Event”事件被执行。

还要注意事件1和2可以以任何顺序执行,不pipe它们在客户端的调用顺序如何。

  //For Example **alternate** asynchronous event //Client //1. Listen to this event socket.on('First_Event', function (data) { console.log(data); }); //2.Emit this event async* socket.emit('Synchronous-Event', { my: 'data' }); 

每次调用on()时都会调用callback函数。

NodeJSasynchronous运行并且是非阻塞的I / O。 因此,当第三个START开始处理完成时,控制台上应该有END。

但是Node.JS在代码中跳转,因为END仍在处理中,调用callback并打印控制台上的下一个START,当正在等待的END完成处理时,它显示在控制台上。

 1 disconnect START - z0w0W4scKZ8o6c4nAAAm 1 disconnect END - z0w0W4scKZ8o6c4nAAAm 2 disconnect START - LLnSgRBV9NZ35mjrAAAk 3 disconnect START - djl3hyNvIwAhSEDbAAAn 2 disconnect END - LLnSgRBV9NZ35mjrAAAk 3 disconnect END - djl3hyNvIwAhSEDbAAAn