پرتوپرتو

useAsync

مدیریت وضعیت یک عملیات async (loading / data / error) بدون کتابخانه‌ی سنگین

معرفی

هوک useAsync یک هوکِ سبک برای مدیریت وضعیتِ یک عملیاتِ async یک‌باره است: loading، data و error را نگه می‌دارد و یک تابعِ پایدارِ run می‌دهد.

اگر به caching، حذفِ درخواست‌های تکراری، retry، mutation یا optimistic update نیاز دارید، TanStack Query را ترجیح دهید — این هوک عمداً کوچک مانده است.

چه زمانی استفاده کنیم

  • یک fetch ساده در یک کامپوننت بدون نیاز به cache سراسری
  • صفحه‌ای که فقط یک‌بار داده می‌گیرد و حالت‌های loading/error را نشان می‌دهد

چه زمانی استفاده نکنیم

  • داده‌ای که در چند جا share و cache می‌شود → TanStack Query
  • نیاز به retry/refetch خودکار

استفاده

import { useAsync } from '@partodata/ui'

function UserCard({ id }) {
  const { data, status, run } = useAsync<User>()

  React.useEffect(() => {
    run(() => fetch(`/api/users/${id}`).then((r) => r.json()))
  }, [id, run])

  if (status === 'loading') return <Skeleton className="h-20 w-full" />
  if (status === 'error') return <ErrorState onRetry={() => run(() => fetchUser(id))} />
  return <ProfileCard user={data} />
}

run پایدار است (با useCallback)، پس می‌توانید با خیال راحت آن را در آرایه‌ی وابستگیِ useEffect بگذارید. اگر در حین یک درخواست، درخواستِ تازه‌ای run شود، نتیجه‌ی قدیمی نادیده گرفته می‌شود (بدون race).


پارامترها

امضا: useAsync<T = unknown>(initialData?) — نوع نتیجه را با جنریک T مشخص کنید (مثل useAsync<User>()).

پارامترنوعپیش‌فرضتوضیح
initialDataT | nullnullمقدار اولیه‌ی data — پیش از اولین run و پس از reset همین مقدار برمی‌گردد

مقدار بازگشتی

فیلدنوعتوضیح
dataT | nullنتیجه‌ی آخرین عملیاتِ موفق
errorunknownخطای آخرین عملیات
status'idle' | 'loading' | 'success' | 'error'وضعیتِ فعلی
isLoadingbooleanمیان‌بُرِ status === 'loading' (و مشابه برای بقیه)
run(op: () => Promise<T>) => Promise<T | undefined>اجرای عملیات؛ نتیجه‌ی قبلیِ در حالِ اجرا را لغو می‌کند
reset() => voidبازگشت به حالتِ idle

هوک‌های مرتبط

  • نمایشِ حالتِ خطا → ErrorState
  • نمایشِ حالتِ بارگذاری → Skeleton