如何在此方案中使用JavaScript setTimeout()

时间:2015-08-28 20:59:25

标签: javascript angularjs

在我的Angular应用中,app.js代码从服务器端检索sessionIDuserID

同时,我的导航控制器正在设置一个菜单,该菜单也来自服务器端。

问题是我的导航控制器正在app.js例程之前执行。结果是我的sessionIDuserID变量已分配。

理想情况下,我想知道如何让我的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);
        }

2 个答案:

答案 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();
    }
});

但我认为你需要使用承诺。