Skip to content
Snippets Groups Projects
Commit befe70ea authored by Reiter, Christoph's avatar Reiter, Christoph :snake:
Browse files

Add AbortController related helpers

These allow linking multiple AbortControllers and ceate a timeout abort signal.

For example in case you want to abort a fetch in case

(1) the UI element gets removed
(2) a newer request replacing this one gets started
(3) a timeout happens because the fetch takes too long

createLinkedAbortController() allows merging multiple signals into one
and createTimeoutAbortSignal() allows creating a singal that auto aborts
after some time passes.
parent 33b7f02b
No related branches found
No related tags found
No related merge requests found
import {EventBus} from './eventbus.js';
import {EventBus} from './src/eventbus.js';
import {createLinkedAbortController, createTimeoutAbortSignal} from './src/abort.js';
export {EventBus};
\ No newline at end of file
export {EventBus, createLinkedAbortController, createTimeoutAbortSignal};
\ No newline at end of file
/**
* Takes multiple AbortSignal instances and returns a new AbortController which
* gets aborted if any of the AbortSignals do.
*
* @param {...AbortSignal} signals
* @returns {AbortController}
*/
export function createLinkedAbortController(...signals) {
const controller = new AbortController();
for (const signal of signals) {
if (signal.aborted) {
controller.abort();
break;
} else {
signal.addEventListener('abort', () => {
controller.abort();
});
}
}
return controller;
}
/**
* Returns an AbortSignal which aborts after the specified time.
*
* @param {number} delay Delay in milliseconds
* @returns {AbortSignal}
*/
export function createTimeoutAbortSignal(delay) {
const controller = new AbortController();
setTimeout(() => {controller.abort(); }, delay);
return controller.signal;
}
\ No newline at end of file
File moved
import {assert} from 'chai';
import {createLinkedAbortController, createTimeoutAbortSignal} from '../src/abort.js';
suite('abort', () => {
test('createLinkedAbortController', () => {
let c1 = new AbortController();
let c2 = new AbortController();
const linked = createLinkedAbortController(c1.signal, c2.signal);
assert.isFalse(linked.signal.aborted);
c1.abort();
assert.isTrue(linked.signal.aborted);
c1.abort();
linked.abort();
});
test('createTimeoutAbortSignal', () => {
const signal = createTimeoutAbortSignal(10000000);
assert.isFalse(signal.aborted);
});
});
\ No newline at end of file
import {assert} from 'chai';
import {EventBus, createEventName, checkIndentifier} from '../eventbus.js';
import {EventBus, createEventName, checkIndentifier} from '../src/eventbus.js';
suite('helpers', () => {
test('createEventName', () => {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment