UNPKG

@meisterplayer/util-load-script

Version:

Load a remote script asynchronously

42 lines (35 loc) 1.55 kB
function addEvents(scriptNode, resolve, reject) { scriptNode.addEventListener('load', () => { scriptNode.setAttribute('scriptLoaded', '1'); resolve(); }); scriptNode.addEventListener('error', () => { scriptNode.setAttribute('scriptError', '1'); reject(); }); } export default function loadScript(name, src) { return new Promise((resolve, reject) => { // Check for duplicates. const scriptNode = document.getElementById(name); if (scriptNode) { // The scriptnode IS available but the promise keeps pending because the onload event is not triggered (since the script was already loaded) if (scriptNode.getAttribute('scriptLoaded') === '1') { // we still need to check if the onload-event was triggered previously because the promise could not be resolved (edge case when connection is slow) resolve(); } else if (scriptNode.getAttribute('scriptError') === '1') { // Reject promise again, it errored previously, it's safe to assume it will error again reject(); } else { // The same script was requested by another addEvents(script, resolve, reject); } return; } const script = document.createElement('script'); script.src = src; addEvents(script, resolve, reject); script.id = name; document.getElementsByTagName('body')[0].appendChild(script); }); }