UNPKG

@writ/utils

Version:
71 lines (60 loc) 2.14 kB
'use strict'; 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); }); }