统一事件和承诺是JS / Node

时间:2014-10-18 23:17:03

标签: javascript node.js javascript-events promise eventemitter

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

但有时候,互动更像是一种请求/响应行为,而承诺似乎更为理想。我想知道是否有办法统一这些沟通方式。

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

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

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

正如您所看到的,我们现在与正在进行解密的任何东西分离,但我们的代码要复杂得多。当我们的代码不需要请求/响应类型交互时,我理想的API将允许EventEmitter样式的接口。但是当它确实有请求/响应交互时,它看起来像是:

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

在此示例中,解密库将解密消息,然后发出事件以指示消息已解密。这将通知对任何被解密的消息感兴趣的所有各方。但它也会称之为传递的承诺,从而启动了这个过程。

那里有没有像这样的东西。或者,对JS应用程序更有经验的人可能会提供更好的方法来完成我想做的事情。

1 个答案:

答案 0 :(得分:0)

如果你想让事物与事件分离,而另一方面想拥有方便的基于承诺的界面。我认为可以实现的唯一方法是引入其他可以绑定的实用程序,例如

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