socket.io服务器发出的回调是否会阻塞?

3

当服务器接收到一个emit(即由客户端生成的)时,回调函数是否在处理下一个emit之前完成?

例如:

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 之前会中断另一个...


如果“做一些事情”执行了一些异步活动... - Rayon
什么是“异步活动”? - lombrozo
任何异步执行的内容... - Rayon
是的,但我怎么知道哪些操作是异步执行的?“做一些事情”中的代码只是操作数组并向客户端发送更多的发射...? - lombrozo
2个回答

2
Socket.io坚持基于事件循环的异步代码执行原则,其中当特定名称的事件被发射和/或侦听时,每个emit和on回调都会被执行。由于这些是事件,除非在代码本身中进行了其他安排,否则不能保证顺序执行。
  //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' });
  });

上述代码确保客户端上的“同步事件”在客户端侦听“第一个事件”之后执行。
还要注意,无论客户端的调用顺序如何,事件1和2都可以以任何顺序执行。
 //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' });

0

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

NodeJS以异步方式运行,并且是非阻塞I/O。因此,当第三个START完成处理时,预计在控制台上显示相应的END。

但是,当END仍在处理时,Node.JS会跳过代码,调用回调并在控制台上打印下一个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

是的。如果你想控制代码的流程,那么你必须这样做。 - Sunil Neurgaonkar
我可以在JavaScript中使用哪些阻塞锁? - lombrozo
我怀疑这样做会破坏代码...你遇到了什么问题?如何阻止它?不允许其他用户使用socket吗?我认为那是非常糟糕的选择... - Rayon
@lombrozo 你可以使用 process.nextTick()。请参考此链接:https://nodejs.org/docs/latest/api/process.html#process_process_nexttick_callback_arg - Sunil Neurgaonkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接