@canlooks/ajax
Version:
95 lines (94 loc) • 3.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ajax = void 0;
const core_1 = require("./core");
const utility_1 = require("./utility");
exports.ajax = createInstance();
function createInstance(parentConfig = {}, requestInterceptor = new Set(), responseInterceptor = new Set()) {
const ajaxInstance = (async (config) => {
config = await enforceRequestInterceptors((0, utility_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.requestInterceptor = requestInterceptor;
ajaxInstance.responseInterceptor = responseInterceptor;
/**
* ------------------------------------------------------------------
* sub instance
*/
ajaxInstance.create = (config) => createInstance((0, utility_1.mergeConfig)(parentConfig, config), new Set(requestInterceptor), new Set(responseInterceptor));
/**
* ------------------------------------------------------------------
* 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(requestInterceptor);
config.onRequest && set.add(config.onRequest);
for (const interceptor of requestInterceptor) {
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(responseInterceptor);
config.onResponse && set.add(config.onResponse);
for (const interceptor of responseInterceptor) {
try {
const returnValue = await interceptor(response, error, config);
if (typeof returnValue !== 'undefined') {
response = returnValue;
}
error = null;
isFinalSuccess = true;
}
catch (e) {
error = e;
isFinalSuccess = false;
}
}
if (isFinalSuccess) {
return response;
}
throw error;
}
}