Description
Goal
Provide developers with a method to abort something initiated with fetch()
in a way that is not overly complicated.
Previous discussion
- Add timeout option #20
- Cancelling HTTP fetch w3c/ServiceWorker#592
- Returning a FetchPromise from fetch() w3c/ServiceWorker#625
- Getting errored/closed reader, Auto-releasing reader, Forcible cancel() on a stream streams#297
- Potential security issues when applied to fetch() tc39/proposal-cancelable-promises#4 (security issues)
Viable solutions
We have two contenders. Either fetch()
returns an object that is more than a promise going forward or fetch()
is passed something, either an object or a callback that gets handed an object.
A promise-subclass
In order to not clash with cancelable promises (if they ever materialize) we should pick a somewhat unique method name for abortion. I think terminate()
would fit that bill.
var f = fetch(url)
f.terminate()
Note: the Twitter-sphere seemed somewhat confused about the capabilities of this method. It would most certainly terminate any ongoing stream activity as well. It's not limited to the "lifetime" of the promise.
A controller
The limited discussion on es-discuss https://esdiscuss.org/topic/cancelable-promises seemed to favor a controller. There are two flavors that keep coming back. Upfront construction:
var c = new FetchController
fetch(url, {controller: c})
c.abort()
Revealing constructor pattern:
fetch(url, {controller: c => c.abort()})
Open issues
- What is the effect on the promise? Both forever-pending and explicit rejection have reasonable arguments. We could offer the choice to the developer, but what should be the default?
- What is the effect on the stream? I suspect the Streams Standard is already conclusive on this.
- What syntax of the above two-three solutions do we favor?