← Усі задачіReact · Middle
Хук useAsync
Напишіть хук useAsync(asyncFn), де asyncFn повертає проміс. Хук повертає { status, data, error, run }.
status спочатку "idle". Виклик run(...args) викликає asyncFn(...args) і одразу ставить "pending"; після успіху - "success" з результатом у data, після помилки - "error" з причиною в error, а data скидається в undefined.
Ctrl+Enter - запустити тести. Tab - відступ; щоб вийти з редактора клавіатурою, натисніть Esc, а потім Tab. Код зберігається в цьому браузері.
Тести (3)
const { result } = renderHook(() => useAsync(() => Promise.resolve(1))); expect(result.current.status).toBe('idle'); expect(result.current.data).toBe(undefined);
const double = (x) => Promise.resolve(x * 2); const { result } = renderHook(() => useAsync(double)); act(() => { result.current.run(21); }); expect(result.current.status).toBe('pending'); await waitFor(() => expect(result.current.status).toBe('success')); expect(result.current.data).toBe(42);
const fail = () => Promise.reject(new Error('nope')); const { result } = renderHook(() => useAsync(fail)); act(() => { result.current.run(); }); await waitFor(() => expect(result.current.status).toBe('error')); expect(result.current.error.message).toBe('nope'); expect(result.current.data).toBe(undefined);