angularjs - Authentication: "cannot execute _executeQueryCore until metadataStore is populated" -
i trying add authentication mobile app, built using angular , breeze.
in app.js:
app.config(function ($httpprovider) { $httpprovider.interceptors.push(intercept) }); //intercept runs on every http request , response //when there 401 error uses broadcast send event //the application scope function intercept($rootscope) { return { request: function (config) { $rootscope.$broadcast('loading:show'); return config; }, response: function (response) { $rootscope.$broadcast('loading:hide'); return response; }, responseerror: function (error) { if (error.status === 401) { $rootscope.$broadcast('error:401'); } return error; } } } app.run(function ($rootscope, $ionicloading, $state) { $rootscope.$on('loading:show', function () { $ionicloading.show({ template: 'loading...' }); }); $rootscope.$on('loading:hide', function () { $ionicloading.hide(); }); //401 errors mean user not authenticated //display login dialog $rootscope.$on('error:401', function () { $ionicmodal .fromtemplateurl("app/user/login.html", { focusfirstinput: true }) .then(function (modal) { modal.show(); }); }); });
and in datacontext.js:
var properties = []; function getproperties(refresh) { if (!refresh && properties.length > 0) { return common.$q.when(properties); } var query = entityquery .from('properties') .select('id, namenumber, streetname, ...etc') .orderby('streetname, namenumber') .totype("property") .using(manager) .execute() .then(querysucceeded, queryfailed); return query; function querysucceeded(data) { //set properties held in memory properties = map(data.results); return properties; } function queryfailed(error) { console.log("error while making http call: " + error.message); //return properties held in memory return properties; } }
the logic goes this:
getproperties()
calledentityquery
triggers request http://.../breeze/breeze/metadata"response 401 (user not authenticated) - expected
'error:401' event broadcast , handled , login screen displayed
this works well.
now, if cancel login dialog, refresh, triggers getproperties
again, time error reported in queryfailed
function:
cannot execute _executequerycore until metadatastore populated
so guess breeze knows call made , therefore expects there, though failed 401. can around problem?
after trying many other things, realised needed resolve responseerror
rejection. otherwise (i guess) breeze believes metadata call successful, , subsequently tries access it, generates error when unsuccessful:
responseerror: function (error) { if (error.status === 401) { $rootscope.$broadcast('error:401'); } //return error; wrong! return $q.reject(error); }
Comments
Post a Comment