🎃

AbortSignal.timeout()を使用してfetchAPIにタイムアウトを設定する

2023/08/01に公開
3

AbortSignal.timeout()

AbortSignal.timeout()を使用することでfetchAPIにタイムアウトを設定できる。
タイムアウトを超過した時にfetchAPIはTimeoutErrorを返し、fetchAPIを中断することができる。

const response = await fetch("url", { signal: AbortSignal.timeout(5000) })

https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/timeout_static

AbortController

https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal#browser_compatibility
上記のリンクを見ると、AbortSignal.timeout()に対応していないブラウザがある。
その場合はnew AbortController()でインスタンスを作成する。
その後setTimeoutを使用し、指定した時間後にAbortErrorを返し、fetchAPIを中断する。
ただし、asyncの中でsetTimeoutを使用すると挙動が変わることがあるので留意する。

const abortController = new AbortController()

// 5秒後にfetchAPIを中断する
const timeoutId = setTimeout(() => { abortController.abort() }, 5000)

const response = await fetch("url", { signal: abortController.signal })

https://developer.mozilla.org/en-US/docs/Web/API/AbortController

参考リンク

https://blog.jxck.io/entries/2023-06-01/abort-signal-any.html

Discussion

junerjuner

asyncの中でsetTimeoutを使用すると挙動が変わることがあるので留意する。

とても気になります。
(queueMicrotask の件であるなら async/await に限らず Promise.prototype.then しまくれは遅延するので。