@meisterplayer/util-load-script
Version:
Load a remote script asynchronously
42 lines (35 loc) • 1.55 kB
JavaScript
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);
});
}