@cloudcome/utils-vue
Version:
cloudcome utils for vue
66 lines (65 loc) • 1.59 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const vue = require("vue");
function useAsync(fn, options) {
const times = vue.ref(0);
const loading = vue.ref(false);
const placeholder = options?.placeholder;
const data = vue.ref(placeholder ? placeholder() : null);
const error = vue.ref(null);
const state = vue.computed(() => ({
times: times.value,
loading: loading.value,
data: data.value,
error: error.value
}));
const runAsync = async (...inputs) => {
loading.value = true;
error.value = null;
try {
times.value++;
options?.onBefore?.(...inputs);
data.value = await fn(...inputs);
options?.onSuccess?.(data.value, ...inputs);
return data.value;
} catch (err) {
error.value = err;
options?.onError?.(err, ...inputs);
throw err;
} finally {
loading.value = false;
options?.onAfter?.(...inputs);
}
};
const run = (...inputs) => {
runAsync(...inputs).then();
};
return {
state,
/**
* 是否正在加载。
*/
loading,
/**
* 异步操作返回的数据。
*/
data,
/**
* 异步操作抛出的错误。
*/
error,
/**
* 执行异步操作并返回 Promise。
* @param inputs 异步函数的参数。
* @returns 异步操作的结果。
*/
runAsync,
/**
* 执行异步操作但不返回 Promise。
* @param inputs 异步函数的参数。
*/
run
};
}
exports.useAsync = useAsync;
//# sourceMappingURL=async.cjs.map
;