来自$ stateChangeStart的AngularJS运行函数中未设置异步数据

时间:2018-01-10 17:43:38

标签: angularjs angular-ui-router

我正在尝试从服务中设置角度运行功能的值。 第一次加载时,该值未在会话存储中设置。 当我第二次重新加载网址时,该值将可用。请帮我解决这个问题

appName.run(function($rootScope, $state, $window, testSerivces) {
  $rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) {
    if ($window.sessionStorage.getItem('loginID') === null) {
      testSerivces.login().then(function(response) {
        $window.sessionStorage.setItem('loginID', response.data.profile.id);
      }, function(e) {
        console.log(e);
      }).finally(function() {

      });
    }
  });
});

1 个答案:

答案 0 :(得分:1)


  您看到此行为是因为您在调用async时发送testSerivces.login()请求,同时State Change将继续发送。即testSerivces.login()发生在后台,而State Change正在继续它的传播。因此,您必须停止该事件并等待服务解决然后继续。将代码更改为

appName.run(function($rootScope, $state, $window, testSerivces) {
  $rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) {
    if ($window.sessionStorage.getItem('loginID') === null) {
        event.preventDefault(); // Prevent Propgation
        testSerivces.login().then(function(response) {
        $window.sessionStorage.setItem('loginID', response.data.profile.id);
        $state.go(toState, toParams); //Start Propogation Again
      }, function(e) {
        console.log(e);
      }).finally(function() {

      });
    }
  });
});

会做的伎俩。希望这会有所帮助。