[JavaScript] async/await非対応(callback関数型)の古いライブラリをasync/awaitが使えるようにする

 古めのライブラリを使わざるをえない状況になったとき、そのライブラリがPromiseを返さないcallback関数型のインターフェースであることがよくあります。

 そんなときは、async関数でwrapすることで、await修飾子が使えるようにしてしまいましょう。

目次

callback関数型とは

 こんなやつです。

function delay(millisec, callback){
  setTimeout(callback, millisec);
}

delay(3000, ()=>{
  console.log("delayed!");
});

 本当はこう書きたいですよね。

await delay(3000);
console.log("delayed!");

PromiseでWrapする

function delay(millisec, callback){
  setTimeout(callback, millisec);
}

function wrappedDelay(millisec){
  return new Promise(resolve=>{
    delay(millisec, ()=>{
      resolve();
    });
  });
}

async function callDelay(){
  await wrappedDelay(3000);
  console.log("delayed!");
}

callDelay();

 簡単ですね。

async/awaitについて

 こちらで詳しく解説しています。

 非同期処理を実装するにあたって避けては通れないPromiseと、ES2017からの非同期処理の新しい書き方であるasync/awaitにつ...

 ごくシンプルに言うと、awaitを使うには、Promiseオブジェクトを渡す必要がある、というだけの話なので、今回はそれを実装したに過ぎません。

まとめ

 「callback関数しか対応してないから、そう書くか」と諦めるのではなく、それをwrapした便利な関数を作ってしまえば、コードの見通しもよくなるし、再利用も可能になります。

 常に可読性を考えながらコードを書きたいものですね。