常用功能的节点EventEmitters

时间:2015-08-11 21:13:10

标签: javascript node.js eventemitter

我刚刚介绍了node.js的EventEmitters,并且喜欢代码构建方式更多的回调方式,甚至使用像async这样的库。当有简单的工作流程时,我完全理解基础知识,即:

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

我不能只是将事件与检索客户的行为联系起来,因为在“获得客户”之后有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

1 个答案:

答案 0 :(得分:4)

我不建议将EventEmitters用于您所描述的内容。坚持回调或承诺风格来处理这个问题。

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

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