Skip to content

Instantly share code, notes, and snippets.

@hikalkan
Created December 1, 2016 13:29
Show Gist options
  • Save hikalkan/90567b8e6c0f7b4608d2fff7a0f2ebec to your computer and use it in GitHub Desktop.
Save hikalkan/90567b8e6c0f7b4608d2fff7a0f2ebec to your computer and use it in GitHub Desktop.
Load scripts dynamically.
var app = app || {};
(function ($) {
/* UrlStates enum */
var UrlStates = {
LOADING: 'LOADING',
LOADED: 'LOADED',
FAILED: 'FAILED'
};
/* UrlInfo class */
function UrlInfo() {
this.state = UrlStates.LOADING;
this.loadCallbacks = [];
this.failCallbacks = [];
}
UrlInfo.prototype.succeed = function () {
this.state = UrlStates.LOADED;
for (var i = 0; i < this.loadCallbacks.length; i++) {
this.loadCallbacks[i]();
}
};
UrlInfo.prototype.failed = function () {
this.state = UrlStates.FAILED;
for (var i = 0; i < this.failCallbacks.length; i++) {
this.failCallbacks[i]();
}
};
UrlInfo.prototype.handleCallbacks = function (loadCallback, failCallback) {
switch (this.state) {
case UrlStates.LOADED:
loadCallback && loadCallback();
break;
case UrlStates.FAILED:
failCallback && failCallback();
break;
case UrlStates.LOADING:
this.addCallbacks(loadCallback, failCallback);
break;
}
};
UrlInfo.prototype.addCallbacks = function (loadCallback, failCallback) {
loadCallback && this.loadCallbacks.push(loadCallback);
failCallback && this.failCallbacks.push(failCallback);
};
/* ResourceLoader API */
app.ResourceLoader = (function () {
var _urlInfos = {};
var _loadScript = function (url, loadCallback, failCallback) {
var urlInfo = _urlInfos[url];
if (urlInfo) {
urlInfo.handleCallbacks(loadCallback, failCallback);
return;
}
_urlInfos[url] = urlInfo = new UrlInfo();
urlInfo.addCallbacks(loadCallback, failCallback);
$.getScript(url)
.done(function (script, textStatus) {
urlInfo.succeed();
})
.fail(function (jqxhr, settings, exception) {
urlInfo.failed();
});
};
return {
loadScript: _loadScript
}
})();
})(jQuery);
@hikalkan
Copy link
Author

hikalkan commented Dec 1, 2016

Usage:

app.ResourceLoader.loadScript('...url...');

We can optionally pass loadCallback and failCallback parameters.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment