UNPKG

@canlooks/ajax

Version:
98 lines (97 loc) 3.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ajax = void 0; const core_1 = require("./core"); const util_1 = require("./util"); exports.ajax = createInstance(); function createInstance(parentConfig = {}, beforeRequest = new Set(), beforeResponse = new Set()) { const ajaxInstance = (async (config) => { config = await enforceRequestInterceptors((0, util_1.mergeConfig)(parentConfig, config)); let res; try { res = await (0, core_1.core)(config); } catch (e) { return await enforceResponseInterceptors(null, e, config, false); } const returnValue = await enforceResponseInterceptors(res, null, config, true); return typeof returnValue === 'undefined' ? res : returnValue; }); ajaxInstance.config = parentConfig; /** * ------------------------------------------------------------------ * interceptors */ ajaxInstance.beforeRequest = beforeRequest; ajaxInstance.beforeResponse = beforeResponse; /** * ------------------------------------------------------------------ * sub instance */ ajaxInstance.extend = (config) => createInstance(config ? (0, util_1.mergeConfig)(parentConfig, config) : parentConfig, new Set(beforeRequest), new Set(beforeResponse)); /** * ------------------------------------------------------------------ * alias */ const aliasWithoutBody = (method) => { return (url, config) => ajaxInstance({ ...config, method, url }); }; ajaxInstance.get = aliasWithoutBody('get'); ajaxInstance.delete = aliasWithoutBody('delete'); ajaxInstance.head = aliasWithoutBody('head'); ajaxInstance.options = aliasWithoutBody('options'); const aliasWithBody = (method) => { return (url, body, config) => ajaxInstance({ ...config, method, url, body }); }; ajaxInstance.post = aliasWithBody('post'); ajaxInstance.put = aliasWithBody('put'); ajaxInstance.patch = aliasWithBody('patch'); return ajaxInstance; /** * 执行请求拦截器 * @param config */ async function enforceRequestInterceptors(config) { const set = new Set(beforeRequest); config.onRequest && set.add(config.onRequest); for (const interceptor of beforeRequest) { const newConfig = await interceptor(config); if (typeof newConfig === 'object' && newConfig) { config = newConfig; } } return config; } /** * 执行响应拦截器 * @param response * @param error * @param config * @param isFinalSuccess */ async function enforceResponseInterceptors(response, error, config, isFinalSuccess) { const set = new Set(beforeResponse); config.onResponse && set.add(config.onResponse); for (const interceptor of beforeResponse) { try { const returnValue = await interceptor(response, error, config); if (typeof returnValue !== 'undefined') { response = returnValue; } error = null; isFinalSuccess = true; } catch (e) { response = null; error = e; isFinalSuccess = false; } } if (isFinalSuccess) { return response; } throw error; } }