nodejs使用回调和事件

时间:2013-05-08 06:00:53

标签: javascript node.js asynchronous

我是nodejs编程的新手。所以请耐心等待。

我有两个nodejs模块。一次传递将消息传递给另一个nodejs模块。第二个处理它并将结果传回 到第一个模块。

方法1

第一个模块

:
secondModule.callFunction(message, function(data){
    //deal with the return message from the second module

})
:

第二个模块

:
function callfunction(message, callback){

   //asynchornous functions for processing
   callback(data);
} 
:

方法2

同样的事情,但在第二个模块中使用事件发射器完成

第一个模块

:
secondModule.callFunction(message){

})
secondModule.on('done_event', function(data){
    //deal with the reply
});
:

第二个模块(使用事件发射器)

 :

 function callFunction(message){

//asynchornous functions for processing
self.emit('done_event', data);
 } 
 :

他们都是正确的。这些东西有什么不同(两者都是异步的) 或者我做了些蠢事。

提前致谢

3 个答案:

答案 0 :(得分:10)

普通回调和EventEmitter事件(节点的publisher-subscriber pattern实现)之间的差异

  • 您可以将多个侦听器附加到同一事件。回调是一对一的通知,事件 - 一对多。
  • 您无法从事件中返回值。事件是消息的一种方式。
  • 通常,回调遵循(error,data1,data2,data3,...)签名,因为负责正常和错误数据流的单个回调(以及异步库通常期望这种行为)
  • 另一方面,基于EventEmitter的api倾向于分离错误和非错误消息
  • “error”事件在事件发射器中是特殊的:如果没有侦听器,则EventEmitter会抛出异常。使用回调,您有责任检查第一个错误参数。

在您的示例中,这两种方法都有效。

答案 1 :(得分:2)

我对事件的理解是,当你想要“破坏”你的处理片段和/或你真的不知道什么时候发生的事情时,会使用事件。因此,如果您的callFunction是一个长期运行的任务(例如,为IO做很多事情或等待很多),您可以将其分解成片段并在处理过程中提交data个事件,然后完成一个done事件。但是,如果它只是一个“正常”的函数调用,我只会使用一个回调。

答案 2 :(得分:0)

我会说事件是为了简单地通知发射器何时告诉每个对某件事感兴趣的人。它不在乎他们将如何处理这个事实,它只是告诉和忘记。当然,您可以从事件中返回一个值(通过更改参数中提供的对象的字段),但是考虑到事件模型会假定多个侦听器,这看起来很丑陋,不稳健并且不合逻辑。

回调OTOH用于请求值。您需要一些数据来寻求用户帮助,并需要结果。

例如:

事件-server.on('connection')。客户端已连接,您将其告知并忘记。

回调-server.isIPAllowedCallback(socket): Boolean。有一个客户端,您要检查是否允许该IP。

造成这种差异的主要原因是带有多个侦听器的冒泡事件模型。在仅使用someObject.onSomeEvent = someEventHandler之类的侦听器的语言中,处理程序和回调之间没有区别。