如何在node.js中编写一个事件发送器,让您创build一个函数“myFunction”,但是在运行时调用成功或失败?

例如,我已经看到了这样的function,这是很方便的使用:

myFunction(data). success(function() { // success! }). fail(function() { // fail! }); 

我看不出一个明显的方式来实现。 在查看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; } 

显然,当你试图调用它的时候,这是行不通的。

 testEmitter('hello'). success(console.log('success!')). failure(console.log('failure!')); // TypeError: Object #<EventEmitter> has no method 'success' 

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

这可以“改善”到:

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

这个怎么样? 我已经使用process.nextTick来模拟你想在你的函数中做的asynchronous工作。

 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') } }) return e; } testEmitter("hello").on("success", function(results){ console.log('success!' + results); }).on("failure", function(error){ console.log('failure!' + error); }) 

这些被称为promises或Deferreds ,在jQuery中被广泛使用。

jQuery 1.5中引入的Deferred对象是通过调用jQuery.Deferred()方法创build的可链接的实用对象。 它可以将多个callback注册到callback队列中,调用callback队列,以及中继任何同步或asynchronousfunction的成功或失败状态。

Deferred对象是可链式的,类似于jQuery对象可链接的方式,但它有自己的方法。 在创build一个Deferred对象之后,可以使用下面的任何方法,直接从对象创build链接,或者将对象保存在一个variables中,然后调用该variables的一个或多个方法。

有许多节点模块实现了Deferreds 。