在这种情况下如何使用JavaScript setTimeout()

How to use JavaScript setTimeout() in this scenario

本文关键字:setTimeout JavaScript 何使用 这种情况下      更新时间:2023-09-26

在我的Angular应用中,app.js代码从服务器端检索了一个sessionID和一个userID

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

问题是我的导航控制器在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代码(其中user和session变量还没有定义):

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);
        }

如果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毫秒,更改以适应您的需要。美元区间API

您可以使用watcher:

$rootScope.$watch(function () {
    return $rootScope.rageSessionVars.sessionID;
}, function (newValue, oldValue) {
    if (newValue !== void 0) {
        foo();
    }
});

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