Przejdź do treści
Jobless Busters
Z testamiŚrednia15–25 min

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?

  • 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

JavaScript
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

JavaScript
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

JavaScript
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);

Źródło: AI & Agents — ćwiczenia praktyczne — Autorskie ćwiczenie z programu nauki, nie potwierdzone zadanie rekrutacyjne.

JavaScript · uruchamiany w Web Workerze w przeglądarce

Gotowe funkcje pomocnicze (już zdefiniowane, tylko do odczytu)

Tab wcina · Esc, a potem Tab, opuszcza edytor · ⌘/Ctrl + Enter uruchamia testy · Twój kod jest zapisywany w tej przeglądarce.

Uruchom testy, żeby sprawdzić rozwiązanie. Gotowych testów: 3.

Utknąłeś? Podpowiedzi idą od ogólnych do konkretnych.

Najpierw spróbuj naprawdę — rozwiązanie najwięcej daje, gdy już trochę się namęczysz.