@hsui/sdk
Version:
Hundsun frontend framework JSSDK
241 lines (236 loc) • 9.31 kB
JavaScript
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
import axios from 'axios';
import { ajaxSchema, storageSchema, report, runningError, isObject, isPlainObject, validate } from './utils';
var logger;
/**
* ajaxPromise(调用ajax函数得到)和cancel函数(取消请求函数)关系对应
* 其中,key 为 ajaxPromise ,value 为 cancel 函数
*/
export var ajaxCancelMap = new WeakMap();
export function setConfig(opts) {
logger = opts.logger;
}
export function ajax(options) {
var cancel; // 存储当前请求取消函数
var ajaxPromise = new Promise(function (resolve, reject) {
var validationError = validate(ajaxSchema, options);
if (validationError) {
throw report('-1', validationError);
}
var url = options.url,
_options$method = options.method,
method = _options$method === void 0 ? 'post' : _options$method,
_options$data = options.data,
data = _options$data === void 0 ? {} : _options$data,
_options$timeout = options.timeout,
timeout = _options$timeout === void 0 ? 5000 : _options$timeout,
_options$headers = options.headers,
headers = _options$headers === void 0 ? {} : _options$headers,
_options$withCredenti = options.withCredentials,
withCredentials = _options$withCredenti === void 0 ? false : _options$withCredenti,
_options$responseType = options.responseType,
responseType = _options$responseType === void 0 ? 'json' : _options$responseType;
var requestConfig = {
url: url,
method: method,
params: method === 'get' ? data : {},
data: method === 'post' ? data : {},
timeout: timeout,
headers: headers,
// request headers
withCredentials: withCredentials,
responseType: responseType,
cancelToken: new axios.CancelToken(function (c) {
cancel = c;
})
};
logger && logger.debug("\u53D1\u9001\u8BF7\u6C42 ".concat(requestConfig.url, " \u914D\u7F6E\u9879"), requestConfig);
axios(requestConfig).then(function (response) {
var data = response.data,
headers = response.headers,
status = response.status,
statusText = response.statusText;
logger && logger.debug("\u8BF7\u6C42 ".concat(requestConfig.url, " \u5E94\u7B54\u5934\u90E8\u5B57\u6BB5"), headers);
var result = {};
if (options.forceWrappedInData) {
result.data = data;
} else {
result = data;
}
if (isPlainObject(result)) {
// request config
if (options.includeRequestConfig) {
result.config = requestConfig;
}
// response headers
if (options.includeResponseHeaders) {
result.headers = headers;
}
if (options.includeResponseStatusInfo) {
result.status = status;
result.statusText = statusText;
}
}
resolve(result);
}).catch(function (error) {
if (axios.isCancel(error)) {
logger && logger.info("".concat(requestConfig.url, " \u53D6\u6D88\u8BF7\u6C42"));
reject(report('-1', "".concat(requestConfig.url, " \u53D6\u6D88\u8BF7\u6C42 ")));
return;
}
logger && logger.error("\u8BF7\u6C42 ".concat(requestConfig.url, " \u5F02\u5E38"));
if (error.response) {
// The request was made and the server responded with a status code
// that falls out of the range of 2xx
var _error$response = error.response,
status = _error$response.status,
statusText = _error$response.statusText,
_data = _error$response.data,
_headers = _error$response.headers;
logger && logger.error("\u8BF7\u6C42 ".concat(requestConfig.url, " \u5E94\u7B54\u5934\u90E8\u5B57\u6BB5"), _headers);
var result = {};
if (options.forceWrappedInData) {
result.data = _data;
} else {
result = _data;
}
if (isPlainObject(result)) {
// request config
if (options.includeRequestConfig) {
result.config = requestConfig;
}
// response headers
if (options.includeResponseHeaders) {
result.headers = _headers;
}
if (options.includeResponseStatusInfo) {
result.status = status;
result.statusText = statusText;
}
}
return reject(report(status, statusText, result));
} else if (error.request) {
// The request was made but no response was received
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of
// http.ClientRequest in node.js
logger && logger.error(runningError('INVALID_REQUEST'));
reject(report('-1', runningError('INVALID_REQUEST')));
} else {
// Something happened in setting up the request that triggered an Error
logger && logger.error(error.message);
reject(report('-1', error.message));
}
});
});
// 建立关联,ajaxPromise 和 cancel 函数
ajaxCancelMap.set(ajaxPromise, cancel);
return ajaxPromise;
}
export var storage = {
setData: function setData(options) {
return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
var validationError, key, value;
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
validationError = validate(storageSchema, options);
if (!validationError) {
_context.next = 4;
break;
}
logger && logger.error('本地数据写入异常', validationError);
throw report('-1', validationError);
case 4:
key = options.key, value = options.value;
if (isObject(value)) {
value = JSON.stringify(value);
}
value = value.toString();
_context.prev = 7;
logger && logger.debug('本地数据写入成功', key);
return _context.abrupt("return", localStorage.setItem(key, value));
case 12:
_context.prev = 12;
_context.t0 = _context["catch"](7);
logger && logger.error('本地数据写入异常', 'fail to set local data, value could exceed the quota');
throw report('-1', 'fail to set local data, value could exceed the quota');
case 16:
case "end":
return _context.stop();
}
}, _callee, null, [[7, 12]]);
}))();
},
getData: function getData(options) {
return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
var validationError, key, value;
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
validationError = validate(storageSchema, options);
if (!validationError) {
_context2.next = 4;
break;
}
logger && logger.debug('本地数据读取异常', validationError);
throw report('-1', validationError);
case 4:
key = options.key;
if (!localStorage.hasOwnProperty(key)) {
_context2.next = 11;
break;
}
value = localStorage.getItem(key);
logger && logger.debug('读取本地数据成功', key);
return _context2.abrupt("return", value);
case 11:
logger && logger.debug('本地数据读取异常', runningError('NOT_FOUND', {
key: key
}));
throw report('-1', runningError('NOT_FOUND', {
key: key
}));
case 13:
case "end":
return _context2.stop();
}
}, _callee2);
}))();
},
deleteData: function deleteData(options) {
return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
var validationError, key;
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
validationError = validate(storageSchema, options);
if (!validationError) {
_context3.next = 4;
break;
}
logger && logger.error('本地数据删除异常', validationError);
throw report('-1', validationError);
case 4:
key = options.key;
if (!localStorage.hasOwnProperty(key)) {
_context3.next = 10;
break;
}
logger && logger.debug('删除本地数据成功', key);
return _context3.abrupt("return", localStorage.removeItem(key));
case 10:
logger && logger.error('本地数据删除异常', runningError('NOT_FOUND', {
key: key
}));
throw report('-1', runningError('NOT_FOUND', {
key: key
}));
case 12:
case "end":
return _context3.stop();
}
}, _callee3);
}))();
}
};