parallel-universe
Version:
The set of async flow control structures and promise utils.
30 lines (27 loc) • 919 B
JavaScript
import { AbortablePromise } from './AbortablePromise.mjs';
import { withSignal } from './utils.mjs';
function repeat(cb, ms, until) {
return new AbortablePromise((resolve, reject, signal) => {
let timer;
signal.addEventListener('abort', () => {
clearTimeout(timer);
});
(function next(index) {
new Promise(resolve => {
resolve(withSignal(cb(signal, index), signal));
})
.then(value => {
if (signal.aborted) {
return;
}
if (until !== undefined && until(value, index)) {
resolve(value);
return;
}
timer = setTimeout(next, typeof ms === 'function' ? ms(value, index) : ms, index + 1);
})
.catch(reject);
})(0);
});
}
export { repeat };