Skip to content

useAsyncState

A composable for generic async state (loading, error, data) without fetch. Complements useFetch/useQuery for non-HTTP async operations like IndexedDB, Web Worker, or custom logic.

Basic Usage

vue
<script setup>
import { useAsyncState } from "@baklavue/composables";

const { state, execute, isLoading, error } = useAsyncState(async () => {
  const data = await readFromIndexedDB();
  return data;
});

await execute();
</script>

Lazy with Immediate

vue
<script setup>
import { useAsyncState } from "@baklavue/composables";

const { state, execute, isLoading } = useAsyncState(() => fetchUser(userId), {
  immediate: true,
  initialData: null,
});
</script>

With Callbacks

vue
<script setup>
import { useAsyncState, useNotification } from "@baklavue/composables";

const { success, error } = useNotification();
const { state, execute } = useAsyncState(() => loadData(), {
  onSuccess: () => success({ description: "Loaded!" }),
  onError: (err) => error({ description: err.message }),
});
</script>

API

Options

OptionTypeDefaultDescription
immediatebooleanfalseExecute immediately on mount
initialDataTundefinedInitial data value
onSuccess(data: T) => voidCallback on success
onError(error: Error) => voidCallback on error

Return Value

PropertyTypeDescription
stateShallowRef<T | undefined>The resolved data
execute() => Promise<T>Run the async function
isLoadingRef<boolean>True while executing
errorRef<Error | null>Last error if any

TypeScript Support

typescript
import { useAsyncState, type UseAsyncStateOptions } from "@baklavue/composables";

const { state, execute } = useAsyncState<User>(() => fetchUser(id));
// state: ShallowRef<User | undefined>