【问题标题】:Node EventEmitters for Common Functions常用函数的节点事件发射器
【发布时间】:2015-08-11 21:13:10
【问题描述】:

我刚刚被介绍到 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.
});

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

【问题讨论】:

  • 每个客户 (id) 使用一个事件发射器。呃,真的没有;事件发射器只是不适合返回某事(而不是 doing 某事)的函数的模式。你会想看看 Promise。

标签: javascript node.js eventemitter


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2015-01-28
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多