2016-01-16 8 views
5

私はAngularJSとRESTを研究しています。コードサンプルでは、​​認証機能で繰り返し単語callbackが使用されています。 コールバックはJavaScriptまたはAngularのキーワードですか?または、callbackはこのコードで作成されたカスタム変数ですか? callbackはどのようにして以下のコードで動作しますか?グーグルcallbackとAngularJSは使用可能な結果を​​生成していません。 The code for the AngularJS module in question can be read at this linkには、サンプルアプリのすべてのコードも含まれています。AngularJSのコールバックがRE​​STサービスをどのように呼び出しますか?

angular.module('auth', []).factory('auth', 

    function($rootScope, $http, $location) { 

     enter = function() { 
      if ($location.path() != auth.loginPath) { 
       auth.path = $location.path(); 
       if (!auth.authenticated) { 
        $location.path(auth.loginPath); 
       } 
      }     
     } 

     var auth = { 

      authenticated : false, 

      loginPath : '/login', 
      logoutPath : '/logout', 
      homePath : '/', 
      path : $location.path(), 

      authenticate : function(credentials, callback) { 

       var headers = credentials && credentials.username ? { 
        authorization : "Basic " 
          + btoa(credentials.username + ":" 
            + credentials.password) 
       } : {}; 

       $http.get('user', { 
        headers : headers 
       }).success(function(data) { 
        if (data.name) { 
         auth.authenticated = true; 
        } else { 
         auth.authenticated = false; 
        } 
        callback && callback(auth.authenticated); 
        $location.path(auth.path==auth.loginPath ? auth.homePath : auth.path); 
       }).error(function() { 
        auth.authenticated = false; 
        callback && callback(false); 
       }); 

      }, 

      clear : function() { 
       $location.path(auth.loginPath); 
       auth.authenticated = false; 
       $http.post(auth.logoutPath, {}).success(function() { 
        console.log("Logout succeeded"); 
       }).error(function(data) { 
        console.log("Logout failed"); 
       }); 
      }, 

      init : function(homePath, loginPath, logoutPath) { 

       auth.homePath = homePath; 
       auth.loginPath = loginPath; 
       auth.logoutPath = logoutPath; 

       auth.authenticate({}, function(authenticated) { 
        if (authenticated) { 
         $location.path(auth.path); 
        } 
       }) 

       // Guard route changes and switch to login page if unauthenticated 
       $rootScope.$on('$routeChangeStart', function() { 
        enter(); 
       }); 

      } 

     }; 

     return auth; 

    }); 

追加情報::@ okonykの応答に基づいて


、私が呼び出しを別のモジュールからコードを含めています。ここ

は、モジュールのコード自体でありますauth.authenticate()関数:

$scope.login = function() { 
    auth.authenticate($scope.credentials, function(authenticated) { 
     if (authenticated) { 
      //do some stuff 
      $scope.error = false; 
     } else { 
      $scope.error = true; 
     } 
    }) 
} 

login()からauth.authenticate($scope.credentials, function(authenticated)への呼び出しはどのように機能しますか? function(authenticated)パラメータが、auth.authenticate()の機能を決定するブール値を送信していますか?もしそうなら、あなたは明白になりますか?私は一緒にそれを作ることができます。たとえば、trueはコールバックを実行することを示し、falseはコールバックを実行するためのメモを示すかもしれませんが、説明するのに役立ちます。 You can read the code in the sample app for the other module with the login() method by clicking on this link

答えて

5

Hereはかなり良い説明です:、

コールバック関数、また、高階関数として知られている別の関数に渡される関数であるとして(のが、この他の機能「otherFunction」と呼ぶことにしましょう)そのコールバック関数はotherFunction内で呼び出されます(または実行されます)。コールバック関数は本質的にパターン(共通の問題に対する確立された解決策)であり、したがってコールバック関数の使用はコールバックパターンとも呼ばれます。

callbackはキーワードではありません、関数に渡されたパラメータのその名前だけは、あなたが欲しいものは何でも、それを呼び出すことができます(callbackまたはcbはかなり一般的です)。

私はスーパー単純なカスタムビルドコールバック関数の例にそれを説明してみましょう:

function useAsCallback(string){ 
    console.log("callback is being executed with passed parameter: " + string) 
} 

function main(param, callback){ 
    callback(param) 
} 

main(123456, useAsCallback) 

あなたがこれを実行する場合、それは印刷になります。 callback is being executed with passed parameter: 123456

コールバックパターンは、一般的に処理するために使用されますJavaScriptの非同期動作。

EDIT:より具体的な例:あなたのコードスニペットについて話す

...では、コントローラにあなたの工場を注入しますと言うことができます。

今すぐauth.authenticateメソッドが公開されています。 2つのパラメータ(credentials, callback)を渡す必要があります。

auth.authenticate({username: Joe, password: 123456}, function(authStatus){ 
    if(authStatus){ 
    console.log("Successfully authenticated") 
    }else{ 
    console.log("Access denied") 
    } 
}); 

私達はちょうど私たちのauth.authenticate方法のcallbackパラメータとして無名関数を渡します。

EDIT: '追加情報' に responce:

いくつかの誤解があるかもしれないように見えます。あなたが求めている:

はauth.authenticate()

事があることである内部の機能を決定ブールを送信する機能(認証済み)パラメータであり、それは完全な反対がある:auth.authenticate()は「関数に値を渡します(認証された) 'という匿名の関数です。この時点で起こる:callback && callback(auth.authenticated);から.successまたはcallback && callback(false);に - .error

+0

これで 'callback'はどのように上のコードで動作しますか?例えば、(残りの部分の) 'コールバック&&コールバック(偽);'? – CodeMed

+1

'callback && callback(false);' - は、 'callbackがパラメータとして渡された場合、' false'をパラメータとして渡して実行するよりも、 'を意味する略語です。 – oKonyk

+0

ありがとう。 OPの最後に、auth.authenticate()メソッドがどのように呼び出されたかを示すコードを追加しました。これには、githubのサンプルアプリケーションの呼び出しコードへのリンクも含まれています。 'navigation.login()'関数の呼び出しコードが 'auth.authenticate()'関数でどのように動作するのか説明しますか?具体的には、それは真偽値を2番目のパラメータとして送信していますか?真偽はどこから来たのですか?真偽は 'auth.authenticate()'の動​​作にどのように影響しますか?この質問はgithubコードの範囲が限られていますが、私はまだ部分的にしか理解できないような気がします。 – CodeMed

0

に基本的に

callback && callback(auth.authenticated); 

または

callback && callback(false); 

のようなものを書くことがあればそのcallbackが存在し、それを呼び出すことを意味します。

簡単な例:

function foo() { 
    console.log('foo'); 
    return 'Fighting foo!'; 
} 

foo && foo(); 

それはちょうど言語構造、奇妙1及びません可読性のための素晴らしい方法です。このコードは、foo()の呼び出し結果が有効であることを意味しますが、これは決して処理されません。私は単純なifステートメントを使用します。

関連する問題