NestJS异步事件发射器返回值异常问题求助
问题
在NestJS中使用事件发射器时,我定义了如下异步事件处理函数:
@OnEvent(ANALYSIS_CREATED_EVENT, { async: true }) async handleAnalysisCreatedEvent(event: AnalysisCreatedEvent) { this.logger.debug('Processing AnalysisCreatedEvent...'); const { createAnalysisDto, analysisId, results, hash, analysisName, authContext, backtested } = event; const savedAnalysis = await this.analysesRepository.create({ createdBy: authContext.by, updatedAs: authContext.as, updatedBy: authContext.by, ownerId: authContext.as, }); return savedAnalysis.id; }
之后在另一个文件中调用事件发射器:
const res = await this.eventEmitter.emitAsync(ANALYSIS_CREATED_EVENT, analysisCreatedEvent); console.log('the result from the event emitter is ************', res);
但得到的结果是一个Immediate对象数组,而非预期的savedAnalysis.id:
the result from the event emitter is ************ [ Immediate { _idleNext: null, _idlePrev: null, _onImmediate: [Function (anonymous)], _argv: undefined, _destroyed: false, [Symbol(refed)]: true, [Symbol(asyncId)]: 30080, [Symbol(triggerId)]: 29827, [Symbol(kResourceStore)]: Store { logger: [EventEmitter] } } ]
移除{ async: true }后能拿到正确返回值,但这个函数本身确实是异步的,不想移除该配置,请问该怎么解决?
解决方案
问题根源在于@OnEvent的{ async: true }配置:
- 当你添加这个配置时,NestJS会把事件处理器包装成
setImmediate异步任务执行,此时emitAsync会直接返回Immediate对象的数组,而不会等待处理器执行完成并返回结果。 - 实际上NestJS原生支持异步事件处理器,完全不需要额外声明
{ async: true }——只要你的处理器是async函数,emitAsync会自动等待它执行完毕,并且正确收集返回值。
所以最优解就是直接移除{ async: true }配置,保留函数的async关键字即可。这样既保证了函数的异步执行逻辑,又能通过emitAsync拿到预期的返回值。
如果因为特殊需求必须保留{ async: true },可以手动对返回的Immediate对象进行Promise封装等待执行,但这种方式完全没必要,反而会破坏NestJS事件机制的封装性,不推荐使用。
内容的提问来源于stack exchange,提问作者Emeka Obasi
相关产品推荐
相关产品推荐

