UNPKG

@hanxx/vue-hooks

Version:
62 lines (61 loc) 1.83 kB
import { ref, onMounted } from '@vue/composition-api'; function useAsync(fn, options) { // initial state var defaultOptions = options || {}; var manual = defaultOptions.manual, onError = defaultOptions.onError, onSuccess = defaultOptions.onSuccess, _a = defaultOptions.params, params = _a === void 0 ? [] : _a; var initialData = defaultOptions.initialData || {}; var loading = ref(!manual); var error = ref(null); var data = ref(initialData); // execute async function function run() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } loading.value = true; return fn.apply(void 0, args).then(function (resp) { if (resp) { data.value = resp; return resp; } return initialData; }) .then(function (returns) { if (typeof onSuccess === 'function') { onSuccess(returns, params); } }) .catch(function (err) { error.value = err; if (typeof onError === 'function') { onError(err, params); } }) .finally(function () { loading.value = false; }); } function start() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (manual) { return run.apply(void 0, args); } return Promise.resolve(initialData); } onMounted(function () { if (!manual) { run.apply(void 0, params); } }); return { loading: loading, error: error, resp: data, run: start, }; } export default useAsync;