0

私はここで約束に本当に苦労しています。
1日以上経ちましたが、まだわかりません。

私はAngularに不慣れで、より一般的には約束の「概念」に慣れていないので、何かが欠けていると確信していますが、それを理解することはできません.


基本的に、私は$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 が更新されないことです。



プロミスの呼び出しはページリダイレクトの完了を待たないように思えますが、 $state.go を $timeout でラップしても問題は解決しません...

私は本当に迷っています、どんな助けもいただければ幸いです

4

1 に答える 1

0

ストレージの更新が完了して promise を返すまで待ち​​たい非同期アクションである場合は、単純にチェーンすることができます。

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 に答える