Angular JS承诺,JSON数据和有趣的时间

时间:2013-11-11 15:10:37

标签: javascript angularjs promise angular-ui-router

我真的很挣扎在这里的承诺 现在已经超过一天了,我仍然无法理解。

我是Angular的新手,而且更多的是对承诺“概念”的新手,所以我确信有一些我不知道的东西,但我无法弄明白。


基本上,我使用$post请求呼叫远程Web服务,并在success方法中更新$rootScope上的一些数据

login服务

this.login = function(url, request) {

    return $http.post( url, request ).
        success(function(data) {
            if (data.return_code === 0) {
                userData = {
                    name: data.name,
                    role: data.role
                }

                /* 
                 * Inside this function, $rootScope gets 
                 * updated with userData
                 */
                storage.update('user_details', userData)
            }
            else {
                // non authorized user
            }

            return userData

        }).
        error(function(data, status) {
            throw new Error()
        })

    }

然后,在控制器中,我做了类似

的事情
$scope.login = function(url, request) {
    loginService.login(url, request).then(function(response) {

        /* this is a ui.router redirection to the state 'home' */
        $state.go('home')
    })

}


问题是在新页面(home状态)中,$ rootScope没有更新,除非我进行页面重新加载,“解决”了这个问题。


在我看来,承诺的调用并不等待页面重定向的完成,但即使在$ timeout中包装$ state.go也无法解决问题。 ..

我真的迷路了,任何帮助都会受到赞赏

1 个答案:

答案 0 :(得分:0)

如果存储更新是某些异步操作,您希望等待它完成并返回一个承诺,那么您可以直接链接它:

this.login = function(url, request) {
    return $http.post(url, request).then(function(data){
        if (data.return_code === 0) {
            var userData = {
                name: data.name,
                role: data.role
            };
            return storage.update('user_details', userData).then(function(){
                return userData;
            });
        }
        else {

        }
    })
};

用法:

loginService.login(...).then(function(userData){
    //You reach here only after storage.update was completed
    $state.go('home')
});