← Усі задачіReact · Middle

Хук useAsync

Напишіть хук useAsync(asyncFn), де asyncFn повертає проміс. Хук повертає { status, data, error, run }.

status спочатку "idle". Виклик run(...args) викликає asyncFn(...args) і одразу ставить "pending"; після успіху - "success" з результатом у data, після помилки - "error" з причиною в error, а data скидається в undefined.

Тести (3)

  1. const { result } = renderHook(() => useAsync(() => Promise.resolve(1)));
    expect(result.current.status).toBe('idle');
    expect(result.current.data).toBe(undefined);
  2. 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);
  3. 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);