- From: Marius Gundersen <notifications@github.com>
- Date: Thu, 18 Apr 2024 01:29:42 -0700
- To: whatwg/dom <dom@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/dom/issues/1280@github.com>
### What problem are you trying to solve?
There is now an `AbortSignal.any([a, b, c])` that makes it possible to combine multiple signals, but there is currently no way to split a an AbortSignal. I therefore propose the instance method `AbortSignal.prototype.filter(compare)`, which would return a new `AbortSignal` that only triggers if the reason matches some condition. For example:
```js
function(signal){
const timeoutSignal = signal.filter(reason => reason instanceof DOMException && reason.name === 'TimeoutError'); // only when the reason is a TimeoutError
}
```
The above example creates a signal that will only trigger if the reason matches that of `AbortSignal.timeout(ms)`. If the reason doesn't match, then the returned signal will never trigger (since abort signals only ever trigger once).
### What solutions exist today?
It is fairly easy to implement this today as a separate function (to not pollute the prototype):
```js
function filterAbortReason(signal, compare) {
if (signal.aborted && compare(signal.reason)) return AbortSignal.abort(signal.reason);
const abortController = new AbortController();
signal.addEventListener('abort', () => {
if (compare(signal.reason)) {
abortController.abort(signal.reason);
}
});
return abortController.signal;
}
```
### How would you solve it?
The above function could be placed on the AbortSignal prototype:
```js
AbortSignal.prototype.filter = function(compare) {
if (this.aborted && compare(this.reason)) return AbortSignal.abort(this.reason);
const abortController = new AbortController();
this.addEventListener('abort', () => {
if (compare(this.reason)) {
abortController.abort(this.reason);
}
});
return abortController.signal;
}
```
### Anything else?
_No response_
--
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/dom/issues/1280
You are receiving this because you are subscribed to this thread.
Message ID: <whatwg/dom/issues/1280@github.com>
Received on Thursday, 18 April 2024 08:29:46 UTC