我是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);
}
:
他们都是正确的。这些东西有什么不同(两者都是异步的) 或者我做了些蠢事。
提前致谢
答案 0 :(得分:10)
普通回调和EventEmitter事件(节点的publisher-subscriber pattern实现)之间的差异
在您的示例中,这两种方法都有效。
答案 1 :(得分:2)
我对事件的理解是,当你想要“破坏”你的处理片段和/或你真的不知道什么时候发生的事情时,会使用事件。因此,如果您的callFunction
是一个长期运行的任务(例如,为IO做很多事情或等待很多),您可以将其分解成片段并在处理过程中提交data
个事件,然后完成一个done
事件。但是,如果它只是一个“正常”的函数调用,我只会使用一个回调。
答案 2 :(得分:0)
我会说事件是为了简单地通知发射器何时告诉每个对某件事感兴趣的人。它不在乎他们将如何处理这个事实,它只是告诉和忘记。当然,您可以从事件中返回一个值(通过更改参数中提供的对象的字段),但是考虑到事件模型会假定多个侦听器,这看起来很丑陋,不稳健并且不合逻辑。
回调OTOH用于请求值。您需要一些数据来寻求用户帮助,并需要结果。
例如:
事件-server.on('connection')
。客户端已连接,您将其告知并忘记。
回调-server.isIPAllowedCallback(socket): Boolean
。有一个客户端,您要检查是否允许该IP。
造成这种差异的主要原因是带有多个侦听器的冒泡事件模型。在仅使用someObject.onSomeEvent = someEventHandler
之类的侦听器的语言中,处理程序和回调之间没有区别。