如何在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 。