统一事件和承诺是JS /节点

我试图理解使用事件(即Node的EventEmitter)和承诺在同一个系统中的最佳方式。 我喜欢松散地通过某种中央事件中心进行通信的解耦组件的想法。 当一个组件有一些可能与另一个组件相关的信息时,它可以在集线器上发送它。 生成信息的组件需要对消耗信息的组件一无所知。

但有时候,交互更多的是一个请求/响应行为,而这个行为对于这个承诺看起来更加理想。 我想知道是否有办法统一这些沟通方式。

例如,我可以有一个组件,有一个encryption的消息,并需要解密。 我想要一个松散耦合的组件之间的东西与消息和组件处理消息解密。 使用promise可以为请求/响应提供良好的交互,但是代表紧密的耦合。 例如:

message = ... some encrypted message ... decrypting_lib.decrypt(message).then(function(decrypted_message) { ... do something with decrypted_message ... }) 

但是正如你所看到的,我通过引用解密库有一个紧密的耦合。 有了事件,我可以删除这个耦合,但代码似乎更加尴尬:

 message = ... some encrypted message ... callback = function(decrypted_message) { if( message.id != decrypted_message.id ) return; hub.removeListener('message:decrypted', callback); ... do something with decrypted_message ... } hub.on('message:decrypted', callback); hub.emit('message:decrypt', message); 

在第二个例子中,我们发出一条消息,要求在解密消息的同时解密消息。 当然,由于其他消息可能被解密,可能不是我们正在寻找的消息,我们需要检查。 一旦我们发现我们感兴趣的信息,我们也需要停止收听。

正如你所看到的,我们现在和解密的任何东西都是分离的,但是我们的代码更加复杂。 当我们的代码不需要请求/响应types的交互时,我理想的API将允许EventEmitter风格的接口。 但是,当它有一个请求/响应交互时,它看起来像这样:

 hub.on('message:decrypt', message).then(function(decrypted_message) { ... do something with decrypted_message ... }); 

在这个例子中,解密库将解密消息,然后发出一个事件来指示消息被解密。 这将通知所有对解密的消息感兴趣的各方。 但是它也可以称为启动过程所通过的承诺。

有没有像这样的图书馆。 或者也许更有经验的JS应用程序可以提供一个更好的方式来做我想做的事情。

如果你想把事情与事件分离开来,另一方面要有方便的基于承诺的接口。 我认为可以实现的唯一方法就是通过引入其他效用,例如,

 hub.registerForDecryption = function (message) { hub.emit('message:decrypt', message); return new Promise(function (resolve, reject) { hub.on('message:decrypted', function (decrypted) { if (message.id !== decrypted.id) return; resolve(decrypted); }); }); }; ... hub.registerForDecryption(message).then(function (decrypted) { .. do something with decrypted_message ... });