@cycjimmy/mini-xhr
Version:
A very lightweight javascript library for HTTP requests.
304 lines (289 loc) • 8.71 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
/**
* objectIterate
* @param obj
* @param fn
*/
var objectIterate = function objectIterate(obj, fn) {
// eslint-disable-next-line no-restricted-syntax
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
fn.call(null, obj[key], key, obj);
}
}
};
/**
* Params String Make Up
* @param params
* @returns {string}
*/
var paramsStringMakeUp = function paramsStringMakeUp() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
// set data string
var sParams = '';
objectIterate(params, function (value, key) {
var prefix = '';
if (sParams) {
// not first key
prefix = '&';
}
sParams += "".concat(prefix + key, "=").concat(value);
});
return sParams;
};
/**
* get Global
* @returns {any}
*/
var getGlobal = function getGlobal() {
return typeof window === 'undefined' ? global : window;
};
/**
* XMLHttpRequest
* @param method default 'GET'
* @param url
* @param timeout
* @param ontimeoutCB
* @param params
* @param dataType 'json'(default) || 'formData' || 'text'
* @param data
* @param formData
* @param responseType 'arraybuffer' || 'document' || 'json'(default) ||
* 'text' || 'stream' || 'blob'
* @param contentType default 'application/json; charset=UTF-8'
* @param headers default {}
* @param success
* @param fail
* @returns {XMLHttpRequest}
*/
var _XMLHttpRequest = (function (_ref) {
var _ref$method = _ref.method,
method = _ref$method === void 0 ? 'GET' : _ref$method,
url = _ref.url,
_ref$timeout = _ref.timeout,
timeout = _ref$timeout === void 0 ? 0 : _ref$timeout,
_ref$ontimeoutCB = _ref.ontimeoutCB,
ontimeoutCB = _ref$ontimeoutCB === void 0 ? null : _ref$ontimeoutCB,
_ref$params = _ref.params,
params = _ref$params === void 0 ? {} : _ref$params,
_ref$dataType = _ref.dataType,
dataType = _ref$dataType === void 0 ? 'json' : _ref$dataType,
data = _ref.data,
_ref$responseType = _ref.responseType,
responseType = _ref$responseType === void 0 ? 'json' : _ref$responseType,
_ref$contentType = _ref.contentType,
contentType = _ref$contentType === void 0 ? 'application/json; charset=UTF-8' : _ref$contentType,
_ref$headers = _ref.headers,
headers = _ref$headers === void 0 ? {} : _ref$headers,
_ref$success = _ref.success,
success = _ref$success === void 0 ? function () {} : _ref$success,
_ref$fail = _ref.fail,
fail = _ref$fail === void 0 ? function () {} : _ref$fail;
var xhr = new XMLHttpRequest();
var sParams = paramsStringMakeUp(params);
xhr.open(method, sParams ? "".concat(url, "?").concat(paramsStringMakeUp(params)) : url, true);
xhr.onreadystatechange = function () {
if (xhr.readyState !== 4) {
return;
}
if (xhr.status >= 200 && xhr.status < 400) {
success(xhr.response);
} else {
var statusText = xhr.statusText,
status = xhr.status;
fail({
statusText: status ? statusText : 'timeout',
status: status
});
}
};
xhr.timeout = timeout;
if (ontimeoutCB) {
xhr.ontimeout = ontimeoutCB;
}
xhr.responseType = responseType;
if (contentType) {
xhr.setRequestHeader('Content-Type', contentType);
}
// set custom headers
objectIterate(headers, function (value, key) {
xhr.setRequestHeader(key, value);
});
switch (dataType) {
case 'json':
xhr.setRequestHeader('Accept', 'application/json');
xhr.send(JSON.stringify(data));
break;
case 'text':
case 'formData':
xhr.setRequestHeader('Accept', '*/*');
xhr.send(data);
break;
default:
xhr.send(data);
}
return xhr;
});
/**
* get
* @param url
* @param dataType
* @param params
* @param headers
* @param contentType
* @param responseType
* @param timeout
* @param ontimeoutCB
* @returns {Promise<unknown>}
*/
var get = function get(url) {
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
_ref$params = _ref.params,
params = _ref$params === void 0 ? {} : _ref$params,
_ref$headers = _ref.headers,
headers = _ref$headers === void 0 ? {} : _ref$headers,
contentType = _ref.contentType,
_ref$responseType = _ref.responseType,
responseType = _ref$responseType === void 0 ? 'json' : _ref$responseType,
_ref$timeout = _ref.timeout,
timeout = _ref$timeout === void 0 ? 0 : _ref$timeout,
_ref$ontimeoutCB = _ref.ontimeoutCB,
ontimeoutCB = _ref$ontimeoutCB === void 0 ? null : _ref$ontimeoutCB;
return Promise.resolve().then(function () {
return new Promise(function (resolve, reject) {
_XMLHttpRequest({
method: 'GET',
url: url,
params: params,
contentType: contentType,
headers: headers,
responseType: responseType,
timeout: timeout,
ontimeoutCB: ontimeoutCB,
success: function success(res) {
return resolve(res);
},
fail: function fail(err) {
return reject(err);
}
});
});
});
};
/**
* post
* @param url
* @param params
* @param data
* @param dataType
* @param headers
* @param contentType
* @param responseType
* @param timeout
* @param ontimeoutCB
* @returns {Promise<unknown>}
*/
var post = function post(url) {
var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
_ref2$params = _ref2.params,
params = _ref2$params === void 0 ? {} : _ref2$params,
_ref2$data = _ref2.data,
data = _ref2$data === void 0 ? {} : _ref2$data,
_ref2$dataType = _ref2.dataType,
dataType = _ref2$dataType === void 0 ? 'json' : _ref2$dataType,
_ref2$headers = _ref2.headers,
headers = _ref2$headers === void 0 ? {} : _ref2$headers,
contentType = _ref2.contentType,
_ref2$responseType = _ref2.responseType,
responseType = _ref2$responseType === void 0 ? 'json' : _ref2$responseType,
_ref2$timeout = _ref2.timeout,
timeout = _ref2$timeout === void 0 ? 0 : _ref2$timeout,
_ref2$ontimeoutCB = _ref2.ontimeoutCB,
ontimeoutCB = _ref2$ontimeoutCB === void 0 ? null : _ref2$ontimeoutCB;
return Promise.resolve().then(function () {
return new Promise(function (resolve, reject) {
_XMLHttpRequest({
method: 'POST',
url: url,
params: params,
data: data,
dataType: dataType,
headers: headers,
contentType: contentType,
responseType: responseType,
timeout: timeout,
ontimeoutCB: ontimeoutCB,
success: function success(res) {
return resolve(res);
},
fail: function fail(err) {
return reject(err);
}
});
});
});
};
/**
* jsonp
* @param url
* @param params
* @param timeout
* @returns {Promise<any | never>}
*/
var jsonp = function jsonp(url) {
var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
_ref3$params = _ref3.params,
params = _ref3$params === void 0 ? {} : _ref3$params,
_ref3$timeout = _ref3.timeout,
timeout = _ref3$timeout === void 0 ? 5e3 : _ref3$timeout;
var jsonpNameSpace = getGlobal();
var STR_ERROR = 'error';
var STR_TIMEOUT = 'timeout';
return Promise.resolve().then(function () {
return new Promise(function (resolve, reject) {
var oHead = document.querySelector('head');
var oScript = document.createElement('script');
var sParams = paramsStringMakeUp(params);
oScript.src = url;
oScript.type = 'text/javascript';
var callbackName = "jsonp_".concat(Math.random()).replace('.', '');
function clearScript() {
oHead.removeChild(oScript);
clearTimeout(oScript.timer);
jsonpNameSpace[callbackName] = null;
}
// jsonp callback function
jsonpNameSpace[callbackName] = function (json) {
clearScript();
resolve(json);
};
// set oScript.src
if (sParams) {
oScript.src += "?".concat(sParams, "&callback=").concat(callbackName);
} else {
oScript.src += "?callback=".concat(callbackName);
}
// timeout handle
oScript.timer = setTimeout(function () {
clearScript();
reject(STR_TIMEOUT);
}, timeout);
oScript.addEventListener('error', function () {
clearScript();
reject(STR_ERROR);
});
// send
oHead.appendChild(oScript);
});
});
};
var index = {
get: get,
post: post,
jsonp: jsonp
};
exports.default = index;
exports.get = get;
exports.jsonp = jsonp;
exports.post = post;