define([ "./session", "dojo/Deferred", "dojo/_base/lang", "dojo/on", "dojo/_base/xhr" ], function(session, Deferred, lang, on, xhr) { var user = session.get(); var queue = []; on(session, 'change', function(newUser){ user = newUser; retry(); }); function retry() { if (user && queue.length > 0) { var item = queue.shift(); console.log("Retry",item.options.url); real_request(item); } } function real_request(item) { var req = xhr(item.method,lang.mixin(item.options||{},{ failOk: true })); item.promise.ioArgs = req.ioArgs; req.then(function(result){ item.dfd.resolve(result); retry(); }, function(error){ if ( error.response.status === 401 ) { queue.unshift(item); session.restore(); } else { item.dfd.reject(error); retry(); } }); } var _request = function(method, options) { var item = { method: method, options: options, dfd: new Deferred() }; item.promise = lang.delegate(item.dfd.promise); // only do the request directly if we are authenticated and // there are no earlier requests queued. if ( user && queue.length === 0 ) { console.log("Request",options.url); real_request(item); } else { console.log("Push",options.url); queue.push(item); } return item.promise; }; return _request; });