@hsui/core
Version:
Hundsun frontend runtime core framework
194 lines (190 loc) • 6.49 kB
JavaScript
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;
}