@hanxx/vue-hooks
Version:
⚡️ Awesome Vue Hooks
62 lines (61 loc) • 1.83 kB
JavaScript
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;