socket.io SERVER是否会发出回调阻塞?

时间:2016-06-17 09:47:05

标签: javascript node.js sockets socket.io

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

示例:

_Layout.cshtml

我似乎在我的日志中获得此输出:

 @RenderSection("testSection",required:false)

如您所见,START在到达END之前中断了另一个......

2 个答案:

答案 0 :(得分:1)

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' });
  });

上述代码可确保在客户端侦听'First_Event'之后,客户端上的'同步事件'事件执行。

另请注意事件1&无论客户端的呼叫顺序如何,都可以按任何顺序执行。

 //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' });

答案 1 :(得分:0)

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

NodeJS异步运行,是非阻塞I / O.因此,当第3个START完成处理时,控制台上会出现相应的END。

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