Rozsądne ponawianie żądania
Polecenie: po 429 lub wybranym błędzie serwera spróbuj ponownie, ale z przerwą i ograniczeniem prób. Nie ponawiaj 403. Uwzględnij czas wskazany przez serwer i możliwość anulowania.
Sprawdza: klasyfikację błędów i testowalność czasu.
Kontrakt z testów referencyjnych: retry(operation, options), gdzie options ma attempts oraz opcjonalnie baseMs (domyślnie 100), capMs (5000), signal, random i sleep(ms, signal). Przejściowe są statusy 429, 500, 502, 503 i 504 z klasy HttpError (dostępna obok). Przerwa to losowa część z min(capMs, baseMs * 2 ** n), ale nie krótsza niż retryAfterMs. Anulowanie nie jest błędem przejściowym.
Czas Retry-After jest już przeliczony na milisekundy; parsowanie daty to rozszerzenie.
Dopytanie: co, jeśli zapis się udał, ale odpowiedź nie dotarła?
Przećwiczysz
- Odróżnić błąd chwilowy od trwałego
- Rosnąca przerwa z losowością (jitter)
- Uwzględnić Retry-After
- Testować czas przez wstrzykiwaną funkcję sleep
Testy (3)
Testy przeniesione z reference.test.ts materiału źródłowego (node:test). W przeglądarce działają z tym samym zestawem asercji.
retry: Retry-After, jitter i sukces
let calls = 0; const delays = [];
const value = await retry(async () => { if (++calls < 3) throw new HttpError(429, 200); return 7; },
{ attempts: 3, baseMs: 100, random: () => 0.5, sleep: async ms => { delays.push(ms); } });
assert.equal(value, 7);
assert.deepEqual(delays, [200, 200]);retry: brak retry błędu 403 i limit prób
let calls = 0;
await assert.rejects(retry(async () => { calls++; throw new HttpError(403); }, { attempts: 4 }));
assert.equal(calls, 1);
calls = 0;
await assert.rejects(retry(async () => { calls++; throw new HttpError(503); }, { attempts: 2, sleep: async () => {} }));
assert.equal(calls, 2);retry: anulowanie nie jest przejściowym błędem
const c = new AbortController(); c.abort(new Error('stop')); let calls = 0;
await assert.rejects(retry(async () => { calls++; return 1; }, { attempts: 3, signal: c.signal }), /stop/);
assert.equal(calls, 0);Powiązane pytania
Źródło: AI & Agents — ćwiczenia praktyczne — Autorskie ćwiczenie z programu nauki, nie potwierdzone zadanie rekrutacyjne.