Skip to content

Instantly share code, notes, and snippets.

@yairEO
Created September 28, 2017 09:25
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 yairEO/8b492d520e6818eab797e0b53b5bd06e to your computer and use it in GitHub Desktop.
Save yairEO/8b492d520e6818eab797e0b53b5bd06e to your computer and use it in GitHub Desktop.
jQuery files dependencies loader
/**
* By - Yair Even-Or (2017) MIT license
* loads, using jQuery, dependency files.
* @param {Object} settings [files (Array), baseDir (String), sync (Boolean)]
* @return {Object} [promise]
*/
window.dependencies = {
/**
* @param {Object/Array} settings [either a "settings" object or a simple Array of files to load]
* @return {Object} [jQuery AJAX (promise)]
*/
load: function(opts) {
var settings = {
files: [],
baseDir: '',
sync: false
};
if (typeof opts == 'string')
settings.files = [opts];
// settings can also be a simple Array of strings (files to load)
else if (opts instanceof Array && opts.length) {
settings.files = opts;
} else if (opts instanceof Object)
$.extend(settings, opts);
// for invalid inputs (return a rejected promise)
else if (!opts || !opts.files || !opts.files.length)
return (new $.Deferred()).reject();
return this[settings.sync ? "sync" : "async"](settings);
},
/**
* loads files asynchronously, regardless of their order
* @return {Object} [promise]
*/
async: function(settings) {
var dependenciesDeferreds = [];
settings.files.forEach(function(path) {
var promise = $.ajax({ url: '/' + settings.baseDir + path });
dependenciesDeferreds.push(promise);
})
return $.when(...dependenciesDeferreds);
},
/**
* loads file synchronously (slower)
* @return {Object} [promise]
*/
sync: function(settings) {
var deferred = new $.Deferred();
// reverse the Array order so "pop" method could be used and the load order would be correct
settings.files = settings.files.reverse();
function recursiveLoad(path) {
if (path)
$.ajax({ url: '/' + settings.baseDir + path }).done(onDone)
else
deferred.resolve();
}
function onDone() {
recursiveLoad(settings.files.pop());
}
onDone();
return deferred;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment