diff -r 1fd46a87bbc1 -r e942a49240f4 src/js/data.js --- a/src/js/data.js Mon Nov 21 11:57:33 2011 +0100 +++ b/src/js/data.js Mon Nov 21 14:14:37 2011 +0100 @@ -2,26 +2,48 @@ IriSP.DataLoader = function() { this._cache = {}; + + /* + A structure to hold callbacks for specific urls. We need it because + ajax calls are asynchronous, so it means that sometimes we ask + multiple times for a ressource because the first call hasn't been + received yet. + */ + this._callbacks = {}; }; IriSP.DataLoader.prototype.get = function(url, callback) { var base_url = url.split("&")[0] - if (this._cache.hasOwnProperty(url)) { + if (this._cache.hasOwnProperty(base_url)) { callback(this._cache[base_url]); - } else { - /* we need a closure because this gets lost when it's called back */ - // uncomment you don't want to use caching. - // IriSP.jQuery.get(url, callback); + } else { + if (!this._callbacks.hasOwnProperty(base_url)) { + this._callbacks[base_url] = []; + this._callbacks[base_url].push(callback); + /* we need a closure because this gets lost when it's called back */ + + // uncomment you don't want to use caching. + // IriSP.jQuery.get(url, callback); + + var func = function(data) { + this._cache[base_url] = data; + var i = 0; + + for (i = 0; i < this._callbacks[base_url].length; i++) { + this._callbacks[base_url][i](this._cache[base_url]); + } + }; + + IriSP.jQuery.get(url, IriSP.wrap(this, func)); - IriSP.jQuery.get(url, (function(obj) { - return function(data) { - obj._cache[base_url] = data; - callback(obj._cache[base_url]); - }; - })(this)); - - + } else { + /* simply push the callback - it'll get called when the ressource + has been received */ + + this._callbacks[base_url].push(callback); + + } } } @@ -71,4 +93,4 @@ default: return undefined; } -}; \ No newline at end of file +};