如何在node.js中编写事件发射器,让你创建一个函数"myFunction",然后在运行时调用成功或失败?

Lav*_*tis 5 javascript design-patterns node.js

例如,我见过这样的函数,使用起来很方便:

myFunction(data).
  success(function() { // success! }).
  fail(function() { // fail! });
Run Code Online (Sandbox Code Playgroud)

我看不出如何实现这一点的明显方法.在查看Node.js文档之后,这是我悲伤的尝试:

var EventEmitter = require('events').EventEmitter;
var testEmitter = function(x) {
  var e = new EventEmitter();

  if (x) {
    e.emit('success', 'got: ' + x);
  } else {
    e.emit('failure', 'no x passed')
  }

  return e;
}
Run Code Online (Sandbox Code Playgroud)

显然,当你试图调用它时,这将不起作用:

testEmitter('hello').
  success(console.log('success!')).
  failure(console.log('failure!'));

  // TypeError: Object #<EventEmitter> has no method 'success'
Run Code Online (Sandbox Code Playgroud)

实现这种模式的最佳方法是什么?

lip*_*ipp 9

这可以"改进"到:

var EventEmitter = require('events').EventEmitter;

var testEmitter = function(x) {
  var e = new EventEmitter();

  process.nextTick(function(){
    if (x) {
      e.emit('success', 'got: ' + x);
    } else {
      e.emit('failure', 'no x passed')
    }
   })

  var self = {};
  self.success = function(f) {
    e.on('success',f);
    return self;
  };
  self.failure = function(f) {
    e.on('failure',f);
    return self;
  };
  return self;
};

testEmitter("hello").success(function(results){
  console.log('success!',results);
}).failure(function(error){
  console.log('failure!' + error);
})
Run Code Online (Sandbox Code Playgroud)