Primiseやasyncみたいな仕組みで対応できるのでしょうか...?
可能ですが、依存元のライブラリがPromiseインスタンスを投げ返してくれる前提です。
一応解説しておくと、Promise.allというメソッドが用意されており、
Promiseインスタンスの配列を投げ込むと
全て実行完了になった時に.then
が発火する仕組みになっています。
JavaScript
1const func1 = () => new Promise((resolve, reject) => resolve(123))
2const func2 = () => new Promise((resolve, reject) => resolve(234))
3
4Promise.all([func1(), func2()])
5 .then(results => {
6 console.log(results) // [123, 234]
7 })
該当の処理がPromiseを返さない場合は無理です。
まぁ、Promiseで包んでやれば動くんじゃないですかね?
JavaScript
1const getData = () => new Promise((resolve, reject) => {
2 // バイナリデータを受け取ったときに発火
3 dataConnection.on('data', (data)=>{
4 // 特定のdataを受け取るという条件A
5 resolve(data);
6 });
7});
8
9const getMedia = () => new Promise((resolve, reject) => {
10 // メディアストリームを受け取ったときに発火
11 mediaConnection.on('stream', (stream)=>{
12 // streamを受け取るという条件B
13 resolve(stream);
14 });
15})
16
17Promise.all([getData(), getMedia()])
18 .then(([data, media]) => {
19 console.log(data);
20 console.log(media);
21 });
ES2017のasync/await構文はPromiseのthenがダサいということで糖衣構文で表現しているだけなので、
Promiseを返さないライブラリ相手では使えません。
やってる事は似たようなもんです。
JavaScript
1const getData = () => new Promise((resolve, reject) => {
2 // バイナリデータを受け取ったときに発火
3 dataConnection.on('data', (data)=>{
4 // 特定のdataを受け取るという条件A
5 resolve(data);
6 });
7});
8
9const getMedia = () => new Promise((resolve, reject) => {
10 // メディアストリームを受け取ったときに発火
11 mediaConnection.on('stream', (stream)=>{
12 // streamを受け取るという条件B
13 resolve(stream);
14 });
15})
16
17// await構文を使うには、async関数内である条件があるので、即時実行関数で発火
18(async functon () {
19 const promises = {
20 data: getData(),
21 media: getMedia(),
22 };
23 const data = await promises.data;
24 const stream = await promises.media;
25 console.log(data);
26 console.log(stream);
27})();
asyncライブラリ(ES2017のasync/await構文とは別) を利用する手もあります。
リンクを張っておいたので使い方は見て下さい。
ただし、基本的に非同期関数はtry〜catchで握れない為、
第一引数がerrであるという前提で考える慣習があります。
その辺が許容出来るならasyncライブラリは中々良い選択肢だと思います。