【问题标题】:Are socket.io SERVER emit callbacks blocking?socket.io SERVER 发出回调阻塞吗?
【发布时间】:2016-10-19 02:29:06
【问题描述】:

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

例子:

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

【问题讨论】:

  • 如果 “做一些事情”做一些异步活动..
  • 什么是“异步活动”?
  • 任何异步执行的东西......
  • 是的,但是我怎么知道异步执行了什么? 'Do stuff' 中的代码只是在操作数组并向客户端发送更多发射...?

标签: javascript node.js sockets socket.io


【解决方案1】:

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

NodeJS 异步运行并且是非阻塞 I/O。因此,当第三个 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

【讨论】:

  • 是的。如果您想控制代码中的流程,那么您必须这样做。
  • 我可以在 JavaScript 中使用哪些阻塞锁?
  • 我怀疑这会以某种方式破坏代码。您面临什么问题?怎么可能挡得住?不允许其他用户使用socket?我认为这是一个非常糟糕的选择......
  • @lombrozo 你可以使用 process.nextTick()。参考这个link
【解决方案2】:

Socket.io 坚持基于事件循环的异步代码执行的基本原则,当具有特定名称的事件发生时,您的每个 emiton 回调都会被执行已发出和/或收听。

由于这些是事件,因此无法保证顺序执行,除非在代码本身中进行了其他安排

  //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 可以按任何顺序执行,无论它们在客户端的调用顺序如何。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-18
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    相关资源
    最近更新 更多