发射内部异步返回数据

时间:2018-08-26 14:22:12

标签: javascript node.js asynchronous

我在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的后台进程。

1 个答案:

答案 0 :(得分:0)

由于似乎没有一种直观的方式来等待Promise同步解决而没有回调,或者没有将EventEmitter与异步回调一起使用,因此我编写了自己的简单的EventEmitter,其中包含一个数组以及自定义的onemit方法。

它可以正确处理用作参数的异步函数,因此我可以像这样使用它:

asyncEmitter.on('name', async (event, argument) => {
    event.argument = await asyncMethod(); // Nice and clean code!
});

我当然可以进一步开发它来创建once函数,依此类推,但是对我来说,我实际上仅依赖于onemit。 我想知道为什么节点团队还没有解决这个问题?