UNPKG

@magic_npm/simple-tools

Version:

`simple-tools` is a simple set of tools

176 lines (175 loc) 5.24 kB
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