gpt4 book ai didi

node.js - 使用异步和同步调用收集结果

转载 作者:太空宇宙 更新时间:2023-11-04 01:09:13 24 4
gpt4 key购买 nike

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

我写它作为对此的回答:EventEmitter implementation that allows you to get the listeners' results?

此代码的问题在于它假设每个监听器都是异步的。如果其中之一是异步的,那么 async.series 就会失败。

我的想法是用一个函数包装监听器,检查它的最后一个参数是否是一个函数。如果不是,它应该用一个与异步调用类似的函数来包装它。但是,我在这件事上惨败了。

帮忙?

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

这是一个简单的测试方法:

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

谢谢!

最佳答案

这根本不可能完成。故事结束。

关于node.js - 使用异步和同步调用收集结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19653056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com