[whatwg/fetch] Proposal: fetch with multiple AbortSignals (#905)

I have some 'Higher Order functions' that can create me a `fetch` function with some extra behavior on it.

Some of them can abort request.
Here a simplified example with a timeout that can abort:

```
const fetch = pipe(
  window.fetch,
  withTimeout({ timeoutInMs: 100 }), // 1 fetch can take max 100ms
  withRetry({ retryCount: 3, delayInMs: 100 }), // Retry 3x with a delay of 100ms
  withTimeout({ timeoutInMs: 400 }), // all fetches (with retry) can take max 400ms
)
```

The first `withTimeout` will create an `AbortController` instance and set the signal property on the requestInit argument of `fetch`,
The second `withTimeout` will also create an `AbortController` and set the signal to the requestInit argument. This gives a problem because there already is a signal.

I could create for this sample one `AbortController` outside the `withTimeout`'s and pass it to both `withTimeout`'s as argument, but in a real application the enhancing of the `fetch` function can be done on different layers in the application. This causes other problems:
- I must know if a parent layer already added abort behavior, if so I must pass the `abortController` instance to `withTimeout`.
- I must known which `abortController` instance is used for this `fetch` and have acces to it.

and this makes the code more dirty in my opinion.


What would be great is a way to pass multiple abort signals to a `fetch` function, some idea's:
- let `fetch` also accept an array of abortSignals
- provide a way to combine/merge two `AbortSignal`'s into one `AbortSignal`

[Here the example on CodePen](https://codepen.io/jovdb/pen/LoNvJd?editors=0011)

-- 
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/905

Received on Saturday, 11 May 2019 00:28:29 UTC