UNPKG

@hsui/core

Version:

Hundsun frontend runtime core framework

194 lines (190 loc) 6.49 kB
import _createClass from "@babel/runtime/helpers/esm/createClass"; import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck"; import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2"; import { ajax, ajaxCancelMap } from '@hsui/sdk'; import { extend } from './utils'; import { MiddlewareManager, beforeRequestSend, afterRequestSend } from './middleware'; import { log } from './log'; function final_(error, response) { if (error) { return Promise.reject(error); } return Promise.resolve(response); } /** * 合并全局配置和实例配置 * @param {Object} defaultConfig 全局配置 * @param {Object} config 实例配置 * @returns 合并后的请求配置 */ function mergeConfig(defaultConfig, config) { var mergedConfig = _objectSpread(_objectSpread({}, defaultConfig), config); if (mergedConfig.shouldMergeHeaders) { var defaultHeaders = defaultConfig.headers; var configHeaders = config.headers; var mergedHeaders = _objectSpread(_objectSpread({}, defaultHeaders), configHeaders); mergedConfig.headers = mergedHeaders; } return mergedConfig; } /** * fetchPromise(调用fetch函数得到) 和 ajaxPromise(调用ajax函数得到) 关联对应 * 其中,key 为 fetchPromise,value 为 ajaxPromise */ var fetchMap = new WeakMap(); var defaultConfig = { method: 'post', data: {}, timeout: 5000, headers: {}, withCredentials: false }; var Fetch = /*#__PURE__*/_createClass(function Fetch() { var _config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Fetch); extend(defaultConfig, _config); var ajaxPromise; // 存储 ajax 返回的 promise beforeRequestSend.final(function (config) { return new Promise(function (resolve, reject) { var error, response; ajaxPromise = ajax(config); ajaxPromise.then(function (res) { return response = res; }).catch(function (err) { return error = err; }).finally(function () { afterRequestSend.runAndReturn(error, response).then(resolve).catch(reject); }); }); }); afterRequestSend.final(final_); function fetch(config) { log.debug('Fetch 实例初始化选项', mergeConfig(defaultConfig, config)); var fetchPromise = beforeRequestSend.runAndReturn(mergeConfig(defaultConfig, config)); fetchMap.set(fetchPromise, ajaxPromise); // 建立关联,fetchPromise 和 ajaxPromise return fetchPromise; } fetch.get = function (url, config) { if (config) { extend(config, { url: url, method: 'get' }); } else { config = { url: url, method: 'get' }; } return fetch(config); }; fetch.post = function (url, data, config) { if (config) { extend(config, { url: url, method: 'post', data: data }); } else { config = { url: url, method: 'post', data: data }; } return fetch(config); }; fetch.cancel = function () { for (var _len = arguments.length, fetchPromises = new Array(_len), _key = 0; _key < _len; _key++) { fetchPromises[_key] = arguments[_key]; } fetchPromises.forEach(function (fetchPromise, index) { var ajaxPromise = fetchMap.get(fetchPromise); var cancel = ajaxCancelMap.get(ajaxPromise); cancel ? cancel() : log.debug("\u6CA1\u6709\u627E\u5230\u4E0B\u6807\u4E3A ".concat(index, " \u5BF9\u5E94\u7684 cancel \u51FD\u6570")); }); }; return fetch; }); export { Fetch as default }; export function initFetch() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$defaultConfig = _ref.defaultConfig, defaultConfig = _ref$defaultConfig === void 0 ? { method: 'post', data: {}, timeout: 5000, headers: {}, withCredentials: false } : _ref$defaultConfig, _ref$beforeRequestSen = _ref.beforeRequestSendMiddlewares, beforeRequestSendMiddlewares = _ref$beforeRequestSen === void 0 ? [] : _ref$beforeRequestSen, _ref$afterRequestSend = _ref.afterRequestSendMiddlewares, afterRequestSendMiddlewares = _ref$afterRequestSend === void 0 ? [] : _ref$afterRequestSend; var beforeRequestSend = new MiddlewareManager('before-request-send'); beforeRequestSend.concat(beforeRequestSendMiddlewares); var afterRequestSend = new MiddlewareManager('after-request-send'); afterRequestSend.concat(afterRequestSendMiddlewares); afterRequestSend.final(final_); var ajaxPromise; // 存储 ajax 函数返回的 promise beforeRequestSend.final(function (config) { return new Promise(function (resolve, reject) { var error, response; ajaxPromise = ajax(config); ajaxPromise.then(function (res) { return response = res; }).catch(function (err) { return error = err; }).finally(function () { afterRequestSend.runAndReturn(error, response).then(resolve).catch(reject); }); }); }); var fetch = function fetch(config) { log.debug('Fetch 实例初始化选项', mergeConfig(defaultConfig, config)); var fetchPromise = beforeRequestSend.runAndReturn(mergeConfig(defaultConfig, config)); fetchMap.set(fetchPromise, ajaxPromise); return fetchPromise; }; fetch.get = function (url, config) { if (config) { extend(config, { url: url, method: 'get' }); } else { config = { url: url, method: 'get' }; } return fetch(config); }; fetch.post = function (url, data, config) { if (config) { extend(config, { url: url, method: 'post', data: data }); } else { config = { url: url, method: 'post', data: data }; } return fetch(config); }; fetch.cancel = function () { for (var _len2 = arguments.length, fetchPromises = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { fetchPromises[_key2] = arguments[_key2]; } fetchPromises.forEach(function (fetchPromise, index) { var ajaxPromise = fetchMap.get(fetchPromise); // 根据传入的 fetchPromise,查找对应的 ajaxPromise var cancel = ajaxCancelMap.get(ajaxPromise); // 根据指定的 ajaxPromise,查找对应的取消函数 cancel ? cancel() : log.debug("\u6CA1\u6709\u627E\u5230\u4E0B\u6807\u4E3A ".concat(index, " \u5BF9\u5E94\u7684 cancel \u51FD\u6570")); }); }; return fetch; }