parallel-universe
Version:
The set of async flow control structures and promise utils.
32 lines (28 loc) • 954 B
JavaScript
;
var AbortablePromise = require('./AbortablePromise.js');
var utils = require('./utils.js');
function repeat(cb, ms, until) {
return new AbortablePromise.AbortablePromise((resolve, reject, signal) => {
let timer;
signal.addEventListener('abort', () => {
clearTimeout(timer);
});
(function next(index) {
new Promise(resolve => {
resolve(utils.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);
});
}
exports.repeat = repeat;