- From: Pauan <notifications@github.com>
- Date: Thu, 10 Oct 2019 22:44:35 -0700
- To: whatwg/fetch <fetch@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
Received on Friday, 11 October 2019 05:44:36 UTC
@ianstormtaylor I think there's some complicated questions about the timeout. For example, if you specify `timeout: 5000`, should the timeout also include things like `response.json()`? I imagine most of the time the answer is "yes", but then what if you don't call `response.json()`? In other words, how does `fetch` know that you're "done", so it can cancel the timer? So I think this is a better design: ```js async function with_timeout(ms, f) { const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), ms); try { return await f(controller.signal); } finally { clearTimeout(timeoutId); } } ``` Now you can use it like this: ```js with_timeout(5000, (signal) => fetch(url, { signal })) ``` Or if you want it to also cancel the response: ```js with_timeout(5000, async (signal) => { const response = await fetch(url, { signal }); return await response.json(); }) ``` This is a general solution which isn't tied to `fetch`, so you can also use `with_timeout` in other areas, like Streams. -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/whatwg/fetch/issues/20#issuecomment-540917173
Received on Friday, 11 October 2019 05:44:36 UTC