Changeset 522 for Dev/trunk/src/client
- Timestamp:
- 03/17/14 21:50:17 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Dev/trunk/src/client/qed-client/xhr.js
r487 r522 2 2 "./session", 3 3 "dojo/Deferred", 4 "dojo/_base/array", 4 5 "dojo/_base/lang", 5 "dojo/ on",6 "dojo/ _base/xhr"7 ], function(session, Deferred, lang, on, xhr) {6 "dojo/_base/xhr", 7 "dojo/on" 8 ], function(session, Deferred, array, lang, xhr, on) { 8 9 9 var user = session.get(); 10 10 11 var queue = []; 11 12 on(session, 'change', function(newUser){ 12 var user; 13 var generation = 0; 14 15 on(session, 'change', setUser); 16 setUser(session.get()); 17 18 function setUser(newUser) { 13 19 user = newUser; 14 retry(); 15 }); 16 17 function retry() { 18 if (user && queue.length > 0) { 19 var item = queue.shift(); 20 console.log("Retry",item.options.url); 21 real_request(item); 20 generation += 1; 21 if ( user ) { 22 // we make a local copy, just in case the requests cause 23 // events to happen 24 var q = queue; 25 queue = []; 26 array.forEach(q,real_request); 27 } else { 28 session.restore(); 22 29 } 23 30 } 24 31 25 32 function real_request(item) { 33 var req_generation = generation; 26 34 var req = xhr(item.method,lang.mixin(item.options||{},{ 27 35 failOk: true … … 29 37 item.promise.ioArgs = req.ioArgs; 30 38 31 req.then(function(result){ 39 console.log("Do request",item.options.url); 40 req.then(function(result) { 32 41 item.dfd.resolve(result); 33 retry();34 42 }, function(error){ 35 43 if ( error.response.status === 401 ) { 36 queue.unshift(item); 37 session.restore(); 44 if ( user ) { 45 if ( req_generation === generation ) { 46 console.log("Retry after reauthentication",item.options.url); 47 // we need to reauth 48 queue.push(item); 49 setUser(null); 50 } else { 51 console.log("Retry immediately",item.options.url); 52 // we already did, redo request right away 53 real_request(item); 54 } 55 } else { 56 console.log("Retry when authenticated",item.options.url); 57 queue.push(item); 58 } 38 59 } else { 39 60 item.dfd.reject(error); 40 retry();41 61 } 42 62 }); 43 63 } 44 64 45 var _ request= function(method, options) {65 var _xhr = function(method, options) { 46 66 var item = { 47 67 method: method, … … 50 70 }; 51 71 item.promise = lang.delegate(item.dfd.promise); 52 // only do the request directly if we are authenticated and 53 // there are no earlier requests queued. 54 if ( user && queue.length === 0 ) { 55 console.log("Request",options.url); 72 // only do the request directly if we are authenticated 73 if ( user ) { 74 console.log("Immediate",options.url); 56 75 real_request(item); 57 76 } else { 58 console.log(" Push",options.url);77 console.log("Delay until authenticated",options.url); 59 78 queue.push(item); 60 79 } … … 62 81 }; 63 82 64 return _ request;83 return _xhr; 65 84 });
Note: See TracChangeset
for help on using the changeset viewer.