在我的Angular应用中,app.js
代码从服务器端检索sessionID
和userID
。
同时,我的导航控制器正在设置一个菜单,该菜单也来自服务器端。
问题是我的导航控制器正在app.js例程之前执行。结果是我的sessionID
和userID
变量已分配。
理想情况下,我想知道如何让我的app.js
代码在任何事情之前解雇。
但是,与此同时,我想使用JavaScript setTimeout()
函数来模拟延迟调用。这意味着,我只想在定义sessionID和userID变量时继续。
我的app.js代码(初始化会话和用户变量的地方):
(function () {
'use strict';
angular.module('rage', [
'ui.router',
'ui.bootstrap',
'ui.dashboard',
'kendo.directives'
]).run(['$rootScope', '$state', 'userService', init]);
function init($rootScope, $state, userService) {
$rootScope.rageSessionVars = {};
$rootScope.$state = $state;
userService.getInitParams().then(function (razorEnvJson) {
$rootScope.rageSessionVars = razorEnvJson;
userService.init(rzEnvJson).then(function (data) {
var response = data.status;
if (response.match(/SUCCESS/g)) {
userService.openUserSession(razorEnvJson).then(function (data) {
var sessionID = data.data[0];
$rootScope.rageSessionVars.sessionID = sessionID;
$rootScope.rageSessionVars.userID = "bobmazzo1234";
console.log("sessionID = " + sessionID);
$rootScope.rageSessionVars.currDashboardName = "Default";
});
}
});
});
}
})();
navigation-controller.js代码(尚未定义用户和会话变量):
function activate() {
$timeout(getDashboards, 1000); // give time for app.js to init vars
}
function getDashboards() {
// GET ALL DASHBOARDS VIA API.
var timeout;
if ($rootScope.rageSessionVars.sessionID == undefined) {
?? SHOULD I DO SOMETHING HERE IN CASE ???
}
var sid = $rootScope.rageSessionVars.sessionID;
var userId = $rootScope.rageSessionVars.userID;
dashboardcontext.getDashboards(sid, userId);
}
答案 0 :(得分:1)
如果userID和sessionID已返回,您可以在控制器中使用$interval
检查每x
个毫秒数,如下所示:
var stop = $interval(function() {
if ($rootScope.rageSessionVars.sessionID != undefined) {
//SUCCESS CODE HERE - DON'T FORGET TO STOP THE INTERVAL!
$interval.cancel(stop);
}
}, 100);
我使用了100毫秒,根据您的需要进行更改。 $interval API
答案 1 :(得分:1)
您可以使用观察者:
$rootScope.$watch(function () {
return $rootScope.rageSessionVars.sessionID;
}, function (newValue, oldValue) {
if (newValue !== void 0) {
foo();
}
});
但我认为你需要使用承诺。