古めのライブラリを使わざるをえない状況になったとき、そのライブラリが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した便利な関数を作ってしまえば、コードの見通しもよくなるし、再利用も可能になります。
常に可読性を考えながらコードを書きたいものですね。