2016-03-31 6 views
0

以下の機能があります。これは、ユーザーが正しいパスワードとユーザー名を入力したかどうかを確認します。これは正しく機能しますが、関数は成功/エラー関数が起動する前に戻ります。http取得要求を実行する際の競合状態を修正しました。angularJS

したがって、関数は常にtrueを返します。関数に正しい値が返されるようにするには、どのような方法が最適でしょうか。

angular.module('services.security', []) 
    .provider('securityService', function() { 



     this.$get = function ($q, $location, $rootScope, $window, $injector) { 
      ... 
      loginCheck: function(username, password) { 
        var failed = true;      

        $injector.get('$http').post(AUTH_URL, 
         {username: username, password: password}, {loginType: "cancel"} 
        ).success(function loginSuccess(data) { 

         failed = false; 

        }).error(function loginFailure(data, status) { 

         failed = true; 

        }); 

        return failed; 
       }, 
+0

'$のinjector'は何ですか?それは非同期の投稿ですか? – choz

+1

'$ injector'はAngularの依存性注入サービスですが、' $ http'を直接注入するのではなく、なぜ@OPがインジェクタを注入しているのか分かりません... –

答えて

0

:あなたはちょうどそれがsuccssfulだったかどうかを確認するには、この返された約束を使用することができ、あなたのコードでは

return $http("...");

をJavaScript Promisesへそれはあなたがここで働いているものです。問題は、HTTP呼び出しが(一般的に)非同期であることです。つまり、コードが処理を続行する前に終了するのを待たないということです。

true/false値を直接返す代わりに、関数はtrue/false値を表す約束を返す必要があります。それから、本質的に「HTTP呼び出しが終了したときに結果をこれらの関数に渡す」というハンドラ関数をアタッチすることができます。Angularのより新しいバージョン、例えば1.4.4+や1.5.xを使用している場合角2であるが、おそらくこれも適用されます)、$http.post()メソッドはとにかく約束を返しますので、直接返すことができます。

重要なことは、.then()約束の方法です。成功の機能は、第二は、障害機能であるあなたはこのようなあなたのコードを書き換える必要がありますので:。確かにOまで読ん

loginCheck: function(username, password) { 
    var failed = true;      

    return $injector.get('$http').post(AUTH_URL, 
    {username: username, password: password}, {loginType: "cancel"} 
); 
} 

// ... 

// somwhere else where securityService.loginCheck() is used 
securityService.loginCheck(username, password).then(
    // success 
    function(data) { 
    // handle successful login 
    }, 
    // failure 
    function(data, status) { 
    // handle failed login 
    } 
); 

これは、これらの日書かれているどのように非同期コードです。 n約束と非同期の概念私は一般的に、現代のWeb開発では非常に重要です。

4

約束を返すことをお勧めします。 だから、あなたは自分のhttp-コール返すことができます:あなたはいくつかの研究を行う必要があります

loginCheck(u, p).then(function() { 
    //success 
}, function() { 
    // error 
}); 
関連する問題