目的
JavaScriptにおいて、長いリクエストがタイムアウトした場合の処理を実装するのには
様々な書き方があると思うが、
その中でもasync, awaitを使った非同期処理におけるタイムアウト処理の実装に苦労したので
まとめておく。
実装が雑で申し訳ないが、誰かの役に立てば。
参考資料
サンプルコード
共通部分
async function main_request() {
return new Promise((resolve) => {
// あえてタイムアウト時間より長い処理にする
setTimeout(() => {
resolve("ok");
}, 5000);
});
}
async function exec_request() {
var response = await promise_test(3000)
console.log(response)
}
Promise.race()を使わない実装
return部分で何を返しているかがわかりにくい
async function promise_test(ms) {
return new Promise(async function (resolve) {
setTimeout(() => {
// タイムアウト
resolve('timeout');
}, ms);
var response = await main_request()
resolve(response)
});
}
exec_request() //output: timeout
Promise.race()を使った実装
return部分で何を返しているかが明確
async function promise_test(ms) {
var timeout = (ms) => new Promise(function (resolve) {
setTimeout(function () {
// タイムアウト
resolve("timeout");
}, ms);
});
return Promise.race([
timeout(ms),
main_request()
])
}
exec_request() //output: timeout
注釈
async, awaitは不慣れで、無駄な箇所があるかもしれません。
よりよい書き方があったら教えてください!