异步处理所有事件处理程序的方法?

Posted

技术标签:

【中文标题】异步处理所有事件处理程序的方法?【英文标题】:Way to async process all event handlers? 【发布时间】:2016-09-06 04:18:02 【问题描述】:

我正在寻找一种方法来了解何时发出 event 并且所有处理程序都已完成触发。

下面的代码记录了以下内容:

after do something
undefined
do something one
do something two

而我正在寻找的是这样的:

do something one
do something two
after do something
undefined

代码如下:

import Promise from 'bluebird'
import  EventEmitter  from 'events'

let event = new EventEmitter()

let doSomethingOne = Promise.resolve().then(() => console.log('do something one'))
let doSomethingTwo = Promise.resolve().then(() => console.log('do something two'))

event.on('myEvent', async function () 
  return await doSomethingOne()
)

event.on('myEvent', async function () 
  return await doSomethingTwo()
)

async function main() 
  event.emit('myEvent', 'name': 'tom')
  // await event.finalized('myEvent')
  console.log('after do something')


main()
  .then(console.log)
  .catch(console.error.bind(console))

在事件、promise 或 javascript 中是否有任何想法可以让您获得回调/promise/await 所有异步事件处理程序?

像这样:

await event.finalized('myEvent')

注意我知道在异步函数中没有真正需要等待一个承诺。这只是为了表明这些事件处理程序是异步的。

【问题讨论】:

阅读bahmutov.calepin.co/promisify-event-emitter.html 如果我理解正确,这可能就是您要找的东西? github.com/yortus/asyncawait 但是,这似乎使代码行为更加同步(如生成器),因此如果您真的希望您的代码继续异步,可能还不够 在 github gulpjs/bach repo 中寻找 gulp4 的 bach 库。我相信这就是你想要的。它有 .series 和 .parallel,你可以自定义和嵌套任何你想要的。 rxjs 来救援! github.com/ReactiveX/rxjs 【参考方案1】:

我刚刚创建了一个节点模块 event-as-promised,它允许您使用 await / .then() .emit() 处理程序。

let event = new EventAsPromised()

event.on('customerAdd', (data) => 
  let status = 'added': true
  return Promise.resolve(status).delay(100)
)

event.emit('customerAdd', 'name': 'Thomas')
  .then(data => 
    console.log(data) // => ['added': true]  
  )

【讨论】:

以上是关于异步处理所有事件处理程序的方法?的主要内容,如果未能解决你的问题,请参考以下文章

WCF 异步调用 - 事件处理程序中的异常

.NET 中的异步 WMI 事件处理

在 Windows 服务的 timer_elapsed 事件处理程序中使用异步等待

如何在一个类中实现异步

使接收到的Websocket事件进行异步处理的最佳方法

如何使事件处理程序异步运行?