@writ/utils
Version:
My tool kit
71 lines (60 loc) • 2.14 kB
JavaScript
;
function destroy(sid, tid) {
var script = document.getElementById(sid);
if (script) {
document.getElementsByTagName('head')[0].removeChild(script);
}
if (tid) {
clearTimeout(sid);
}
try {
delete window[sid];
} catch (e) {
window[sid] = undefined;
}
}
function JsonpError(message) {
this.message = message;
}
JsonpError.prototype = new Error;
JsonpError.prototype.constructor = JsonpError;
JsonpError.prototype.name = 'JsonpError';
/**
*
* @param {string} url 请求的地址
* @param {object} option 请求的配置项
* @param {number} option.timeout 请求的超时时间
* @param {string} option.charset 请求使用的字符集
* @param {string} option.callback 与被请求地址约定的callback名称
*/
export default function jsonp(url, option) {
if ('string' !== typeof url) {
throw new Error('[Jsonp Error] `url` must be a string!');
}
option = 'object' === typeof option && option ? option : {};
const callback = option.callback ? option.callback.toString() : 'callback';
const timeout = !isNaN(option.timeout) && option.timeout > 0 ? option.timeout : 10000;
const charset = option.charset ? option.charset : (document.characterSet || document.charset);
const sid = Date.now() + '_' + Math.floor(Math.random() * 100000);
let timer;
return new Promise(function (resolve, reject) {
const script = document.createElement('script');
url += (url.indexOf('?') === -1) ? '?' : '&';
script.src = url.concat(`${callback}=${sid}`);
script.charset = charset;
script.id = sid;
window[sid] = function (res) {
destroy(sid, timer);
resolve(res);
};
timer = setTimeout(function () {
destroy(sid, timer);
reject(new JsonpError('Request timeout.'));
}, timeout);
script.onerror = function () {
destroy(sid, timer);
reject(new JsonpError('Request error.'));
};
document.getElementsByTagName('head')[0].appendChild(script);
});
}