sinter-compositions
Version:
vue3 composition 工具库
38 lines (32 loc) • 966 B
text/typescript
import {reactive} from 'vue'
type Options = {
immediate?: boolean
lock?: boolean
}
export function useWrapperFetch(handler: Function, options: Options = {
immediate: true,
lock: true
}) {
const state = reactive({
loaded: false,
loading: false,
success: false,
})
function fetch(...args: Array<any>) {
if (options.lock && state.loading) {
return undefined
}
state.loading = true
const t = handler.apply(null, args)
if (t instanceof Promise || ( typeof t.then === 'function' && typeof t.finally === 'function' && typeof t.catch === 'function')) {
t.then(() => {
state.success = true
}).catch(() => state.success = false).finally(() => {
state.loaded = true
state.loading = false
})
}
return t
}
return [state, fetch] as [typeof state, typeof fetch]
}