@magic_npm/simple-tools
Version:
`simple-tools` is a simple set of tools
176 lines (175 loc) • 5.24 kB
JavaScript
const useData = function(func) {
const model = func();
return [
model,
/**
* 合并数据,数据初始化的合并
* @param coverData - 需要合并的数据
* @param isReset - 是否重置性合并
* @returns 合并后的数据
*/
(coverData, isReset) => {
const cover = isReset || !coverData ? useData.mergeData(func(), coverData) : coverData;
return useData.mergeData(model, cover);
}
];
};
useData.getDataType = function(data) {
return Object.prototype.toString.call(data).slice(8, -1).toLowerCase();
};
useData.mergeData = function(data, cover) {
if (data && useData.getDataType(data) === "object" && ["object", "undefined"].includes(useData.getDataType(cover))) {
cover && Object.keys(data).forEach((k) => {
if (k in cover) {
data[k] = cover[k];
}
});
}
return data;
};
function useApi(api, options) {
const {
isCancel,
isRepeat,
isSingle,
loading,
params,
loadingStart,
loadingEnd,
before,
success,
error,
inputModel,
outputModel
} = {
isCancel: true,
isRepeat: true,
isSingle: false,
...options
};
const apiObj = {
status: 0,
// Api请求的状态,0 待请求, 1 请求中, 2 成功, 3 失败
sendNum: {},
// 根据 loadingKey 来记录请求次数
sendLatestKey: void 0,
// 最新请求的 loadingKey
pm: void 0,
// 最新一次请求结果
err: "",
// 请求错误结果记录
params: void 0,
// 请求参数记录
output: void 0,
// 输出参数数据记录
result: {
res: void 0,
// 未处理前的数据
data: void 0,
// 经过 inputModel 处理后的结果
loadingKey: ""
// loading键名
},
/**
* 关闭正在请求的Api
*/
cancelApi: async () => {
var _a;
const cancel = (_a = apiObj.pm) == null ? void 0 : _a.cancel;
const pm = Promise.resolve();
if (cancel) {
cancel == null ? void 0 : cancel();
apiObj.status = 0;
try {
await apiObj.pm;
} catch (err) {
}
console.log("[cancel successful]");
} else {
console.log("[cancel error] find not cancel function.");
}
return pm;
}
};
const apiFunc = async (query, loadingKey = "value") => {
let loadingState = void 0;
const sameSend = {};
try {
apiObj.params = params == null ? void 0 : params();
apiObj.params && useData.mergeData(apiObj.params, query);
if (typeof before === "function") {
let bPm = before(apiObj.params && JSON.parse(JSON.stringify(apiObj.params)));
if (bPm === false) {
throw "close send api.";
}
if (bPm instanceof Promise) {
await bPm;
}
}
if (!isRepeat && apiObj.status === 1) {
return Promise.reject("操作频繁,请稍后再试");
}
if (isSingle && apiObj.status === 2) {
success == null ? void 0 : success(apiObj.result.data, apiObj.result.loadingKey, apiObj.result.res);
return Promise.resolve(apiObj.result);
}
apiObj.output = typeof outputModel === "function" ? outputModel(apiObj.params && JSON.parse(JSON.stringify(apiObj.params))) : apiObj.params && JSON.parse(JSON.stringify(apiObj.params));
if (isCancel && isRepeat && apiObj.status === 1) {
await apiObj.cancelApi();
}
if (!(apiObj.sendLatestKey === loadingKey && apiObj.status === 1)) {
if (loading && loadingKey && loadingKey in loading) {
loading[loadingKey] = true;
}
if (loadingStart) {
loadingStart(
apiObj.params && JSON.parse(JSON.stringify(apiObj.params)),
loadingKey
);
}
}
if (loadingKey) {
const k = loadingKey;
apiObj.sendNum[k] = (apiObj.sendNum[k] || 0) + 1;
sameSend[k] = apiObj.sendNum[k];
}
apiObj.sendLatestKey = loadingKey;
apiObj.status = 1;
apiObj.pm = api(apiObj.output);
const res = await apiObj.pm;
apiObj.status = 2;
apiObj.result.res = res;
apiObj.result.loadingKey = loadingKey;
if (typeof inputModel === "function") {
apiObj.result.data = inputModel == null ? void 0 : inputModel(res);
}
success == null ? void 0 : success(apiObj.result.data, loadingKey, apiObj.result.res);
} catch (err) {
apiObj.status = 3;
apiObj.err = err;
error == null ? void 0 : error(apiObj.err);
}
const slk = apiObj.sendLatestKey;
if (apiObj.sendLatestKey != loadingKey || slk && sameSend[slk] === apiObj.sendNum[slk]) {
if (loading && loadingKey && loadingKey in loading) {
loading[loadingKey] = false;
}
loadingEnd == null ? void 0 : loadingEnd(loadingState);
}
return new Promise((resolve, reject) => {
if (apiObj.status === 2) {
resolve(apiObj.result);
} else if (apiObj.status === 3) {
reject(apiObj.err);
} else {
reject(new Error("useApi exception"));
}
});
};
return [apiFunc, loading, { ...apiObj }];
}
export {
useApi,
useData
};
//# sourceMappingURL=index.mjs.map