我在node.js中编写了一个使用EventEmitter的后台进程,如下所示:
var event = { returnValue: undefined };
eventEmitter.emit('name', event, argument);
return event.returnValue; // Example of doing things with event.returnValue.
事件的另一端:
eventEmitter.on('name', (event, argument) => {
var returnValue = await asyncMethod(); // <- This method returns a Promise, so I could use await if possible or some other solution.
event.returnValue = returnValue;
});
我试图找到一种使用异步方法的优雅解决方案,但是由于 EventEmitter根本不支持异步函数,因此我无法真正在函数或类似函数中使用await。
一种解决方案是将returnValue
设置为Promise,但这很快就变得不切实际,特别是因为我的某些函数会通过多个异步函数进行迭代。
在第一个代码块继续并尝试使用event.returnValue
之前,我需要所有代码才能正确完成。
我是使用某些第三方“同步”的唯一解决方案,还是node.js的所有人都没有想到这个问题?
如果线程在执行时被阻塞,对我来说真的没有任何问题,因为这是一个没有任何GUI的后台进程。
答案 0 :(得分:0)
由于似乎没有一种直观的方式来等待Promise同步解决而没有回调,或者没有将EventEmitter与异步回调一起使用,因此我编写了自己的简单的EventEmitter,其中包含一个数组以及自定义的on
和emit
方法。
它可以正确处理用作参数的异步函数,因此我可以像这样使用它:
asyncEmitter.on('name', async (event, argument) => {
event.argument = await asyncMethod(); // Nice and clean code!
});
我当然可以进一步开发它来创建once
函数,依此类推,但是对我来说,我实际上仅依赖于on
和emit
。
我想知道为什么节点团队还没有解决这个问题?