TypeScriptで非同期処理(async/await)を同期的に逐次即時実行する

何を言っているのかよくわからないタイトル。
やりたいことはasync/awaitが非同期処理内でしか利用できないので(Promiseを返す関数を作って呼び出すようなことをしないといけない)同期処理中にサクッと埋め込むような記述をしたい。
async/awaitはPromiseを使用しているかつIE11はPromiseが使用できないので、ブラウザ側でIE11に対応する場合は考慮する必要がある。




(async () => {
    await 非同期関数();
})();

のようにすると同期処理内にasync/awaitを埋め込むことができる。
要するに即時関数を用意して実行している。


具体例

/** 非同期処理 ファイル読み込みや通信処理を想定 0~200ミリ秒で返す */
const promiseMethod = (index: number) => {
  return new Promise<number>((resolve, { }) => {
    setTimeout(() => {
      console.log(index);
      resolve(index);
    }, Math.random() * 200);
  });
}

(async () => {
  let result = 0;
  for (let index = 0; index < 10; index++) {
    const retValue = await promiseMethod(index);
    result += retValue;
  }
  console.log(result);
})();


以下のように綺麗に逐次実行されて出力される。
0
1
2
3
4
5
6
7
8
9
45

2018年3月29日木曜日