UNPKG

ipink-util

Version:

util.js

64 lines (61 loc) 2.16 kB
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 };