是否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代码执行的基本原理,当发出和/或监听具有特定名称的事件时,您的每个emit和oncallback都会被执行。
由于这些事件都是顺序执行的,所以除非在代码本身中做出这样的安排
//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