控制器不等待解决

时间:2016-02-08 06:35:39

标签: javascript angularjs

我有一个决心,但控制器似乎在它完成之前就已经运行了。

    $stateProvider.state('index', {
        url: '/',
        templateUrl: '/angular/general/index.general.html',
        resolve: {
            data: function(currentUser){
                currentUser.resolveLogin();
            }
        },
        controller: ['$state', 'currentUser', function($state, currentUser){
            console.log('3');
            if (currentUser.bLoggedIn()){
                $state.go('index.dashboard');
            }
        }]
    });

在currentUser中

    this.resolveLogin = function(){
        var deferred = $q.defer();
        console.log('1')
        $http.get('/profile')
        .success(function(res){
            console.log('2.1')
            root.user = res.data;
            deferred.resolve();
        })
        .error(function(res){
            console.log('2.2')
            deferred.reject();
        });

        // return promise object
        return deferred.promise;
    }

不是按1,2,1,3的顺序记录,而是按1,3,2.1的顺序记录。

1 个答案:

答案 0 :(得分:0)

您忘记了解析函数中的返回保证,因此angular不应等待它。

因此,如果currentUser.resolveLogin();返回承诺,您应该将其返回

resolve: {
    data: function(currentUser){
        return currentUser.resolveLogin();
    }
},

旁注: $http已经返回承诺,因此,您不需要手动创建它,并且可以将this.resolveLogin缩减为此类

this.resolveLogin = function(){
    console.log('1')
    return $http.get('/profile')
    .success(function(res){
        console.log('2.1')
        root.user = res.data;
    })
    .error(function(res){
        console.log('2.2')
    });
}