mana-common
Version:
Common utils for mana
34 lines (29 loc) • 1.03 kB
JavaScript
/* eslint-disable @typescript-eslint/no-explicit-any */
import { CancellationToken, cancelled } from './cancellation';
import { Deferred } from './deferred';
/**
* @returns resolves after a specified number of milliseconds
* @throws cancelled if a given token is cancelled before a specified number of milliseconds
*/
export function timeout(ms, token = CancellationToken.None) {
const deferred = new Deferred();
const handle = setTimeout(() => deferred.resolve(), ms);
token.onCancellationRequested(() => {
clearTimeout(handle);
deferred.reject(cancelled());
});
return deferred.promise;
}
export async function retry(task, delay, retries) {
let lastError;
for (let i = 0; i < retries; i += 1) {
try {
// eslint-disable-next-line no-await-in-loop
return await task();
} catch (error) {
lastError = error; // eslint-disable-next-line no-await-in-loop
await timeout(delay);
}
} // eslint-disable-next-line @typescript-eslint/no-throw-literal
throw lastError;
}