使用asynchronous和同步呼叫收集结果

我有以下代码。 它基本上扩展了EventEmitter,所以它不是发送事件而是忘记它,它实际上收集结果。

我把它写成这样的答案: EventEmitter的实现,可以让你得到听众的结果?

这个代码的问题是它假定每个监听器都是asynchronous的。 如果其中一个是asynchronous的,那么async.series就会失败。

我的想法是用监听器包装一个函数来检查它的最后一个参数是否是一个函数。 它不是,应该用一个和asynchronous调用类似的函数来包装它。 但是,我没有做到这一点。

帮帮我?

var events = require('events'); var util = require('util'); var async = require('async'); // Create the enhanced EventEmitter function AsyncEvents() { events.EventEmitter.call(this); } util.inherits(AsyncEvents, events.EventEmitter); // Just a stub AsyncEvents.prototype.onAsync = function( event, listener ){ return this.on( event, listener ); } // Async emit AsyncEvents.prototype.emitAsync = function( ){ var event, module, results = [], functionList = [], args, callback, eventArguments; // Turn `arguments` into a proper array args = Array.prototype.splice.call(arguments, 0); // get the `hook` and `hookArgument` variables event = args.splice(0,1)[0]; // The first parameter, always the hook's name eventArguments = args; // The leftovers, the hook's parameters // If the last parameter is a function, it's assumed // to be the callback if( typeof( eventArguments[ eventArguments.length-1 ] ) === 'function' ){ callback = eventArguments.pop(); // The last parameter, always the callback } var listeners = this.listeners( event ); listeners.forEach( function( listener ) { // Pushes the async function to functionList. Note that the arguments passed to invokeAll are // bound to the function's scope functionList.push( function( done ){ listener.apply( this, Array.prototype.concat( eventArguments, done ) ); } ); }); callback ? async.series( functionList, callback ) : async.series( functionList ); } 

这是一个简单的方法来testing它:

 asyncEvents = new AsyncEvents(); asyncEvents.onAsync('one', function( paramOne1, done ){ done( null, paramOne1 + ' --- ONE done, 1' ); }); asyncEvents.onAsync('one', function( paramOne2, done ){ done( null, paramOne2 + ' --- ONE done, 2' ); }); // Uncomment this and async will fail //asyncEvents.onAsync('one', function( paramOne3, done ){ // return paramOne3 + ' --- ONE done, 3' ; //}); asyncEvents.onAsync('two', function( paramTwo, done ){ done( null, 'TWO done, 1' ); }); asyncEvents.emitAsync('one', 'P1', function( err, res ){ console.log( err ); console.log( res ); }); asyncEvents.emitAsync('two', 'P2', function( err, res ){ console.log( err ); console.log( res ); }); 

谢谢!

它根本无法完成。 故事结局。