|
1 |
| -import { noop, promiseTimeout } from '@vueuse/shared' |
| 1 | +import { noop, promiseTimeout, until } from '@vueuse/shared' |
2 | 2 | import type { Ref, UnwrapRef } from 'vue-demi'
|
3 | 3 | import { ref, shallowRef } from 'vue-demi'
|
4 | 4 |
|
5 |
| -export interface UseAsyncStateReturn<Data, Params extends any[], Shallow extends boolean> { |
| 5 | +export interface UseAsyncStateReturnBase<Data, Params extends any[], Shallow extends boolean> { |
6 | 6 | state: Shallow extends true ? Ref<Data> : Ref<UnwrapRef<Data>>
|
7 | 7 | isReady: Ref<boolean>
|
8 | 8 | isLoading: Ref<boolean>
|
9 | 9 | error: Ref<unknown>
|
10 | 10 | execute: (delay?: number, ...args: Params) => Promise<Data>
|
11 | 11 | }
|
12 | 12 |
|
| 13 | +export type UseAsyncStateReturn<Data, Params extends any[], Shallow extends boolean> = |
| 14 | + UseAsyncStateReturnBase<Data, Params, Shallow> |
| 15 | + & PromiseLike<UseAsyncStateReturnBase<Data, Params, Shallow>> |
| 16 | + |
13 | 17 | export interface UseAsyncStateOptions<Shallow extends boolean, D = any> {
|
14 | 18 | /**
|
15 | 19 | * Delay for executing the promise. In milliseconds.
|
@@ -129,11 +133,27 @@ export function useAsyncState<Data, Params extends any[] = [], Shallow extends b
|
129 | 133 | if (immediate)
|
130 | 134 | execute(delay)
|
131 | 135 |
|
132 |
| - return { |
| 136 | + const shell: UseAsyncStateReturnBase<Data, Params, Shallow> = { |
133 | 137 | state: state as Shallow extends true ? Ref<Data> : Ref<UnwrapRef<Data>>,
|
134 | 138 | isReady,
|
135 | 139 | isLoading,
|
136 | 140 | error,
|
137 | 141 | execute,
|
138 | 142 | }
|
| 143 | + |
| 144 | + function waitUntilIsLoaded() { |
| 145 | + return new Promise<UseAsyncStateReturnBase<Data, Params, Shallow>>((resolve, reject) => { |
| 146 | + until(isLoading).toBe(false) |
| 147 | + .then(() => resolve(shell)) |
| 148 | + .catch(reject) |
| 149 | + }) |
| 150 | + } |
| 151 | + |
| 152 | + return { |
| 153 | + ...shell, |
| 154 | + then(onFulfilled, onRejected) { |
| 155 | + return waitUntilIsLoaded() |
| 156 | + .then(onFulfilled, onRejected) |
| 157 | + }, |
| 158 | + } |
139 | 159 | }
|
0 commit comments