@canlooks/ajax
Version:
A private tool
95 lines (94 loc) • 3.37 kB
JavaScript
import { core } from './core';
import { mergeConfig } from './util';
export const ajax = createInstance();
function createInstance(parentConfig = {}, beforeRequest = new Set(), beforeResponse = new Set()) {
const ajaxInstance = (async (config) => {
config = await enforceRequestInterceptors(mergeConfig(parentConfig, config));
let res;
try {
res = await 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
? 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;
}
}