0

我真的为这里的承诺而苦苦挣扎。
现在已经一天多了,我还是想不通。

我是 Angular 的新手,更一般地说,我是 Promise“概念”的新手,所以我确定我缺少一些东西,但我无法弄清楚。


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

登录服务

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 没有更新,除非我重新加载页面,这“解决”了问题。



在我看来,promise 的调用不会等待它完成页面重定向,但即使将 $state.go 包装在 $timeout 中也不能解决问题......

我真的迷路了,任何帮助将不胜感激

4

1 回答 1

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')
});
于 2013-11-11T19:17:13.470 回答