ipink-util
Version:
util.js
64 lines (61 loc) • 2.16 kB
JavaScript
import { HttpConfig } from './config.mjs';
let script, done, timer, counter = 0;
function getUniqueCallbackName(name) {
return name + "_json" + ++counter;
}
function getQuery(baseUrl, params, callbackName, callbackUnique) {
let query = (baseUrl || "").indexOf("?") === -1 ? "?" : "&";
params = params || {};
for (let key in params) {
if (params.hasOwnProperty(key)) {
query += encodeURIComponent(key) + "=" + encodeURIComponent(params[key]) + "&";
}
}
return baseUrl + query + callbackName + "=" + callbackUnique;
}
function load(url, errorCallback) {
if (typeof document === "undefined" || !document.createElement) return;
script = document.createElement("script");
script.src = url;
script.async = true;
if (typeof errorCallback === "function") {
script.onerror = errorCallback;
}
script.onload = script.onreadystatechange = function() {
if (!done && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) {
done = true;
script.onload = script.onreadystatechange = null;
if (script && script.parentNode) {
script.parentNode.removeChild(script);
}
}
};
document.getElementsByTagName("head")[0].appendChild(script);
}
const jsonp = (url, params, options) => {
if (typeof document === "undefined" || !document.createElement) return Promise.resolve(null);
options = options || {};
options.timeout = options.timeout || HttpConfig.timeout;
let callbackName = options.callback || "callback", callback = getUniqueCallbackName(callbackName);
return new Promise(function(resolve, reject) {
if (options.timeout) {
timer = setTimeout(function() {
reject(new Error("JSONP request timed out."));
}, options.timeout);
}
window[callback] = function(data) {
try {
delete window[callback];
} catch (e) {
}
window[callback] = null;
clearTimeout(timer);
resolve(data);
};
var query = getQuery(url, params, callbackName, callback), error = function() {
reject(new Error("Script loading error."));
};
load(query, error);
});
};
export { jsonp };