← Alle AufgabenJavaScript · Senior
retry: bei Fehlern wiederholen
Schreib eine Funktion retry(fn, attempts, delay). Sie ruft fn auf (eine Funktion, die ein Promise liefert oder wirft) und versucht es bei einem Fehler erneut, insgesamt höchstens attempts Mal, mit delay Millisekunden Wartezeit zwischen den Versuchen.
Liefere das Ergebnis des ersten erfolgreichen Versuchs. Scheitern alle Versuche, lehne mit dem Fehler des letzten ab. Ein synchroner Wurf in fn zählt ebenfalls als gescheiterter Versuch.
Strg+Enter führt die Tests aus. Tab rückt ein; um den Editor per Tastatur zu verlassen, drücke Esc und dann Tab. Der Code wird in diesem Browser gespeichert.
Tests (5)
const f = fn(async () => 'ok'); expect(await retry(f, 3, 10)).toBe('ok'); expect(f).toHaveBeenCalledTimes(1);
let n = 0; const f = fn(async () => { n++; if (n < 3) throw new Error('fail ' + n); return n; }); expect(await retry(f, 5, 10)).toBe(3); expect(f).toHaveBeenCalledTimes(3);
const f = fn(async () => { throw new Error('nope ' + f.calls.length); }); await expect(retry(f, 3, 5)).rejects.toThrow('nope 3'); expect(f).toHaveBeenCalledTimes(3);
const f = fn(() => { throw new Error('sync'); }); await expect(retry(f, 2, 5)).rejects.toThrow('sync'); expect(f).toHaveBeenCalledTimes(2);
let n = 0; const f = async () => { n++; if (n === 1) throw new Error('x'); return 'done'; }; const started = Date.now(); expect(await retry(f, 2, 60)).toBe('done'); expect(Date.now() - started >= 50).toBe(true);