The unit of a request isn’t a call, it’s a scenario.
alova distills every kind of request scenario into four stages and encapsulates them as request strategy functions. Request completeness no longer depends on the engineer or the AI prompt, but is pre-orchestrated by the strategy for that specific scenario.
Sponsors
The four lifecycle stages of a request scenario
Guided by these four lifecycle stages, every request scenario is organized completely, it knows exactly when to trigger, when to reuse, and when to actually send a request, instead of relying on scattered manual glue code.
View the request scenario modelRequest Trigger
Requests are triggered at the right moment — such as manual actions, state changes, pagination, or network reconnection — cutting down unnecessary calls.
Request Decision
Determines how the request should be handled before it is sent.
Request Execution
The network communication happens here, typically handled by fetch, axios, or XHR.
Data Application
The actions after the response is obtained — such as UI updates, automatic transformation, cache refresh, multi-end sync, and use by subsequent steps.
Encapsulate trigger, decision, execution and data application in one cohesive scenario.
alova sits above your transport layer. axios and fetch handle the network, while alova owns the rest of the lifecycle.
A request strategy goes beyond just firing a request.
alova’s request strategies provide a complete, beyond-expectation request feature set by default — no need to spell it out in your prompts.
Debounce
Collapses rapid, redundant triggers automatically. A burst of keystrokes never floods your backend.
Retry
Automatic retries with exponential backoff. Flaky mobile and edge networks won’t break the flow.
Multi-level Cache
L1 memory plus persistent storage. Pages restore instantly and work offline.
Race handling
Race-condition safe. The latest request always wins, and stale responses are discarded.
Auto Refresh
Revalidates data when the window regains focus, the network reconnects, or the tab becomes visible again.
Polling
Flexible continuous or stepped polling. It pauses automatically when you switch tabs.
Request Sharing
Deduplicates identical concurrent requests anywhere in the component tree into a single in-flight call.
Data Preloading
Preload the next page or a detail view on hover. Navigation and pagination feel instant.
Form Draft
Keeps a local snapshot of multi-step forms. Safe from accidental tab closes or refreshes.
Atomic Request
Bundles related reads and writes. A cascade of operations either fully succeeds or rolls back together.
Upload & Download
Byte-accurate progress hooks with pause, abort and resume for large binary transfers.
State-driven Request
Drops imperative dispatching. Data sync becomes a direct, reactive consequence of your UI state.
Every strategy is a complete scenario.
One declaration pre-orchestrates the trigger, the decision, the execution and the data application.
Client strategies
Built-in hooks that declare a complete scenario, trigger, decision, execution and application in one call. No need to stitch those stages together by hand.
Pagination Request
ClientManage paging, preload the next page, and skip needless refreshes. Pagination becomes one declared scenario.
Learn moreconst todoList = (page, size) =>alova.Get('/todos', { params: { page, size } });const { loading, data, page, pageSize, pageCount, total } =usePagination(todoList);
Watch Request
ClientFire requests the moment watched state changes. Ideal for tab switching and filtered searches.
Learn moreuseWatcher(() => alova.Get(`/rewards/${activeKey}`),[activeKey],{debounce: [500, 0]})
Fetch Data
ClientPreload data to render views faster, or re-fetch it across components.
Learn moreconst { fetching, error, fetch } = useFetcher()fetch(alova.Get('/todo/1'))
Token authentication
ClientA global interceptor with silent token refresh. Unified handling of login, logout, assignment and renewal.
Learn moreconst { onAuthRequired, onResponseRefreshToken } = createServerTokenAuthentication({refreshTokenOnError: {isExpired: res => res.status === 401,handler: async () => {const { token, refresh_token } = await refreshToken()localStorage.setItem('token', token)localStorage.setItem('refresh_token', refresh_token)}}})const alovaInstance = createAlova({beforeRequest: onAuthRequired(),responded: onResponseRefreshToken()})
Form Submission
ClientManage form state for you. Any kind of form comes together quickly.
Learn moreconst {loading: submitting,form,send: submit,onSuccess,onError,onComplete} = useForm(formData =>alova.Post('/api/submit', formData),{initialForm: { name: '', cls: '1' }});const handleSubmit = () => submit();
Auto refresh data
ClientRefresh data automatically on browser events. The UI always shows the latest.
Learn moreconst { loading, data, error } = useAutoRequest(() => alova.Get('/api/data'),{enableVisibility: true,enableFocus: true,enableNetwork: true,throttle: 1000,pollingTime: 2000});
Server strategies
Server-side control covers retry, rate limiting and atomic requests, with no extra middleware.
Retry Request
ServerStabilize critical requests by retrying them automatically.
Learn moreconst res = await retry(alova.Post('/api/order'),{retry: 3,backoff: {delay: 1000,multiplier: 2}});
Rate Limit
ServerCap how many requests fire within a given window.
Learn moreconst limit = createRateLimiter({points: 4,duration: 60 * 1000})const orderRes = await limit(alova.Get('/api/order'))
Atomize Requests
ServerGuarantee request atomicity in multi-process environments with a distributed lock. No hand-written locking code.
Learn moreimport { atomize } from 'alova/server';// a distributed lock keeps the request atomicconst res = await atomize(alova.Get('/api/user'),{channel: 'user_lock',timeout: 5000})
Cross-component, zero wiring
Trigger and sync requests across any component. No prop drilling, no global store.
Action Delegation
CrossTrigger, abort and share requests across components and modules. No extra state plumbing.
Learn moreSeamless Data Interaction
CrossKeep shared data consistent across components with automatic state synchronization.
Learn moreExplore all 20+ strategies
Every strategy ships as a documented, ready-to-use module.
Runs in any JS environment with any request tool.
alova hands the network call to the request library you already use, axios, fetch or XHR. It works with React, Vue, Svelte and every major framework, including options and class-based ones.
Proven across a large number of real-world applications.
Adopted in production environments handling millions of critical data events daily.
Used in production by real teams
Open source projects dependent on alova
Request libraries like fetch and axios make requests very simple, and react-query and swr further reduce the boilerplate code of requests. But alova aims to provide extreme API consumption efficiency, achieve more efficient data interaction, and reduce server pressure.
I'm loving this library and slowly migrating my code from Axios to Alova.
Alova is really meticulous. When I read the documents, every point was a pain point and solved many problems.
The alovajs is nice. I plan to switch our products to alovajs uniformly
Make requests more complete, and smoother to use.
From trigger and decision to execution and application, alova gathers the whole request lifecycle so every interaction feels complete and smooth.






