首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Node.js socket.send( )函数在退出前无法完成

Node.js socket.send( )函数在退出前无法完成
EN

Stack Overflow用户
提问于 2015-04-28 05:52:01
回答 1查看 781关注 0票数 17

在我编写的一些Node.js脚本中,我注意到即使最后一行是同步调用,有时也不会在Node.js退出之前完成。

我从来没有见过console.log语句在退出之前无法运行/完成,但我也看到过其他一些语句在退出之前无法完成,我相信它们都是同步的。当然,在这种情况下,我可以理解为什么异步函数的回调无法触发。

所讨论的代码是一个ZeroMQ .send()调用,如下所示:

代码语言:javascript
复制
   var zmq = require('zmq');
   var pub = zmq.socket('pub');

   pub.bindSync('tcp://127.0.0.1:5555');   

    setInterval(function(){
        pub.send('polyglot');
    },500);

如果我删除setInterval()并像这样调用它,上面的代码就像expected...but一样工作:

代码语言:javascript
复制
   var zmq = require('zmq');
   var pub = zmq.socket('pub');

    pub.bindSync('tcp://127.0.0.1:5555');

    pub.send('polyglot');  //this message does not get delivered before exit
    process.exit(0);

...Then消息将不会被传递-程序显然将在pub.send()调用完成之前退出。

确保语句在退出Node.js之前完成的最佳方法是什么?关闭钩子可以在这里工作,但我担心这只会掩盖问题,因为您不能将确保运行所需的所有东西都放在关闭钩子中。

这个问题也可以这样演示:

代码语言:javascript
复制
 if (typeof messageHandler[nameOfHandlerFunction] == 'function') {
          reply.send('Success');
          messageHandler[nameOfHandlerFunction](null, args);
         } else {
         reply.send('Failure'); //***this call might not complete before the error is thrown below.***
         throw new Error('SmartConnect error: no handler for ZMQ message sent from Redis CSV uploader.');
     }

我认为这是一个合法/严重的问题,因为许多程序只需要发布消息,然后就会死亡,但我们如何有效地确保所有消息都被发送(尽管不一定收到)?

编辑:修复此问题的一种(潜在)方法是:

代码语言:javascript
复制
socket.send('xyz');
socket.close(); // supposedly this will block until the above message is sent
process.exit(0);
EN

回答 1

Stack Overflow用户

发布于 2015-05-13 04:56:18

我认为简单的答案是socket.send()方法实际上是异步的,这就是为什么我们看到我在OP中描述的行为。

那么问题就来了--为什么socket.send()必须是异步的--有没有一个阻塞/同步的版本,我们可以用它来代替操作中的预期目的呢?我们可以要socket.sendSync()吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29906637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档