@hanxx/vue-hooks
Version:
⚡️ Awesome Vue Hooks
64 lines (63 loc) • 1.99 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
var composition_api_1 = require("@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 = composition_api_1.ref(!manual);
var error = composition_api_1.ref(null);
var data = composition_api_1.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);
}
composition_api_1.onMounted(function () {
if (!manual) {
run.apply(void 0, params);
}
});
return {
loading: loading,
error: error,
resp: data,
run: start,
};
}
exports.default = useAsync;
;