公共功能的节点事件发射器

Node EventEmitters for Common Functions

我刚刚被介绍给 node.js 的 EventEmitters,我更喜欢代码的结构方式,而不是回调,甚至喜欢使用像异步这样的库。当有一个简单的工作流程时,我完全理解基础知识,即:

this.register = function(email, pass, confirm) {
  var newCustomer = {email:email, pass:pass, confirm: confirm};
  this.emit("newRegistration", newCustomer);
};

var _validate = function(customer{
  this.emit("validated", customer);
};

//...

this.on("newReigstration", _validate);
this.on("validated", _insert);

很有道理。我的问题是如何处理通常调用的函数。例如,我可能有 50 个端点,我在这些端点上传递了一个客户 ID,我需要将客户从数据库中取出,如下所示:

Customer.getCustomer(customerId, function(err, customer) {
  // Got the customer, now go do something.
});

我不能只将一个事件连接到检索客户的行为,因为在 "getting the customer" 之后有 50 件不同的事情要做。所以我不能做这样的事情:

this.on("customerRetrieved", task1);
this.on("customerRetrieved", task2);

this.emit("customerRetrieved", customer); // In getCustomer

因为两者都会被调用,而我每次只想调用一个。我唯一能想到的就是做这样的事情:

this.on("customerRetrievedForTask1", task1);
this.on("customerRetrievedForTask2", task2);

但这看起来很笨拙,更不用说如果我不小心给它取了与已经存在的东西相同的名字的话会很危险。这些常用函数的约定是什么?

Source of code example

我不建议对您所描述的内容使用 EventEmitter。坚持使用回调或承诺的方式来处理这个问题。

使用 EventEmitter 来监视来自隔离模块的事件。

这方面的一个很好的例子是与某种 i/o 建立连接的模块。在建立连接之前,您不想开始执行任务。无需编写循环来继续检查模块是否已建立连接,您只需监听连接事件,然后就可以继续。