Skip to content

Instantly share code, notes, and snippets.

@samtsai
Last active February 21, 2017 19:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save samtsai/14c7a20c1290494d458ca2f9ba945124 to your computer and use it in GitHub Desktop.
Save samtsai/14c7a20c1290494d458ca2f9ba945124 to your computer and use it in GitHub Desktop.
As soon as possible - simple asynchronous script loading library
// ASAP Library
// use case
/*
add omniture to registry
omniture tags are waiting to fire
asap loads omniture asynchronously
page waits for omniture to be ready
omniture loads
asap announces omniture is ready
omniture fires off tags
*/
(function (undefined) {
'use strict';
var registry = {};
function register (name) {
if (registry[name] === undefined) {
registry[name] = {
name: name,
callbacks: [],
results: {},
ready: false
};
}
return registry[name];
}
function regQueue (names, entryName) {
var name = names.shift();
var myEntry = asap(name);
myEntry.then(function (results) {
for (var r in results) {
register(entryName).results[r] = results[r];
}
if (names.length) {
regQueue(names, entryName);
} else {
asap(entryName).resolve();
}
});
}
function asap () {
// TODO: support comma/space-separated string
var regEntry;
var args = Array.prototype.slice.call(arguments);
var name = args.sort().join(',').toLowerCase();
if (args.length === 0) {
throw 'No name to register';
}
regEntry = register(name);
if (args.length > 1) {
regQueue(args, name);
}
var api = {
'resolve': function (val, refresh) {
if (refresh || !regEntry.ready) {
// resolving: set ready to true and triggering event with message
regEntry.ready = true;
if (val != null) {
regEntry.results[regEntry.name] = val;
}
// run callback queue
for (var i = 0, j = regEntry.callbacks.length; i < j; i++) {
// try {
regEntry.callbacks[i](regEntry.results);
// } catch (err) {}
}
}
return api;
},
'then': function (cb) {
if (typeof cb === 'function') {
regEntry.callbacks.push(cb);
if (regEntry.ready) {
// try {
cb(regEntry.results);
// } catch (err) {}
}
}
return api;
}
};
return api;
}
asap.loadScript = function (url, id) {
if (url) {
var doc = document;
var t = doc.createElement('script');
var s = doc.getElementsByTagName('script')[0];
if (id) {
if (doc.getElementById(id)) {
return;
}
t.id = id;
t.onload = t.onreadystatechange = function () {
t.onreadystatechange = t.onload = null;
asap(id).resolve();
};
}
t.type = 'text/javascript';
// Keep script order!
t.async = false;
t.src = url;
s.parentNode.insertBefore(t, s);
}
};
this.asap = asap;
}).call(this);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment