3

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

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

方法一

第一个模块

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

})
:

第二个模块

:
function callfunction(message, callback){

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

方法二

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

第一个模块

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

他们都正确吗。这些事情有什么区别(两者都是异步的)或者我做了一些愚蠢的事情。

提前致谢

4

3 回答 3

10

普通回调和EventEmitter事件之间的区别(这是节点对发布者-订阅者模式的实现)

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

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

于 2013-05-08T06:31:52.483 回答
2

我对事件的理解是,当您想将处理“分解”成碎片时使用事件,和/或您真的不知道事情何时发生。因此,如果您callFunction是一项长时间运行的任务(例如,为 IO 执行或等待很多时间),您可以将其分解为多个部分并提交,例如,data在它处理时提交事件,然后完成一个done事件。但是,如果它只是一个“正常”的函数调用,我会简单地使用回调。

于 2013-05-08T06:07:03.447 回答
0

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

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

例如:

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

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

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

于 2018-10-16T13:30:40.147 回答