@hsui/request
Version:
Hundsun frontend runtime request framework
221 lines (209 loc) • 6.88 kB
JavaScript
import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2';
import { createLogger, ajax, ajaxCancelMap } from '@hsui/sdk';
import _toConsumableArray from '@babel/runtime/helpers/esm/toConsumableArray';
import _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck';
import _createClass from '@babel/runtime/helpers/esm/createClass';
/**
* Native extend
*/
var extend = Object.assign;
/**
* Lodash noop
*/
function noop() {
// No operation performed.
}
/**
* @class - MiddlewareManager
* @classdesc - manager of middlewares
*/
var MiddlewareManager = /*#__PURE__*/function () {
function MiddlewareManager(type) {
_classCallCheck(this, MiddlewareManager);
this.type = type;
this.middlewares = [];
this.finalHook = noop;
}
_createClass(MiddlewareManager, [{
key: "final",
value: function final(hook) {
this.finalHook = hook;
}
}, {
key: "concat",
value: function concat(middlewares) {
this.middlewares = this.middlewares.concat(middlewares);
}
}, {
key: "push",
value: function push(middleware) {
this.middlewares.push(middleware);
}
// just run and return nothing
}, {
key: "justRun",
value: function justRun() {
this.args = Array.prototype.slice.call(arguments);
var _this = this;
var fn = function fn(index) {
if (index < this.middlewares.length) {
this.middlewares[index].apply(null, [].concat(_toConsumableArray(this.args), [function () {
fn.call(_this, ++index);
}]));
} else {
this.finalHook.apply(null, this.args);
}
};
fn.call(_this, 0);
}
// run middlewares and return a promise
}, {
key: "runAndReturn",
value: function runAndReturn() {
this.args = Array.prototype.slice.call(arguments);
var _this = this;
return new Promise(function (resolve, reject) {
var fn = function fn(index) {
if (index < this.middlewares.length) {
try {
this.middlewares[index].apply(null, [].concat(_toConsumableArray(this.args), [function () {
fn.call(_this, ++index);
}]));
} catch (error) {
reject(error);
}
} else {
// final hook should return a promise too
this.finalHook.apply(null, this.args).then(resolve).catch(reject);
}
};
fn.call(_this, 0);
});
}
}]);
return MiddlewareManager;
}();
var logger = createLogger();
var log = function log() {
for (var _len = arguments.length, content = new Array(_len), _key = 0; _key < _len; _key++) {
content[_key] = arguments[_key];
}
return logger.info.apply(logger, content);
};
logger.levels.forEach(function (level) {
log[level] = function () {
for (var _len2 = arguments.length, content = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
content[_key2] = arguments[_key2];
}
return logger[level].apply(logger, content);
};
});
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();
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 _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); // 根据传入的 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;
}
export { initFetch };