2016-05-11 9 views
3

eventが放射され、すべてのハンドラが発射を完了したときを知る方法を探しています。すべてのイベントハンドラをasync処理する方法はありますか?

以下のコードは次のように記録します。

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

がありますあなたがコールバックを得ることを可能にするイベント、約束、またはJavaScriptのアイデア/約束/すべてを待っている同期イベントハンドラ?

await event.finalized('myEvent') 

私は非同期関数内1つの約束を待つための本当の必要はありませんことを承知している。注:このように

。これらのイベントハンドラが非同期であることを示すだけです。

+1

私が正しく理解していれば、これはあなたが探しているものかもしれないhttp://bahmutov.calepin.co/promisify-event-emitter.html –

+0

を読みますか? https://github.com/yortus/asyncawaitしかし、これはコードがより同期しているように見えます(ジェネレータのように)ので、あなたのコードを非同期にしたい場合は不十分かもしれません。 –

+0

github gulpjs/bachのgulp4のバッハライブラリを探しますレポ私はあなたが欲しいものだと信じています。それは.seriesと.parallelを持っています。あなたが望むものをカスタマイズして入れ子にすることができます。 – YOU

答えて

0

私はちょうどあなたがawait/.then().emit()ハンドラを可能にするノードモジュールevent-as-promisedを作成しました。

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}] 
    }) 
関連する問題