回调如何在AngularJS中调用REST服务?

Cod*_*Med 8 javascript angularjs

我正在研究AngularJS和REST.代码示例callback在身份验证功能中重复使用该单词. 回调是JavaScript或Angular中的关键字吗?或者callback只是在此代码中创建的自定义变量?如何callback在下面的代码中工作? 谷歌搜索callback和AngularJS没有产生可用的结果. 可以在此链接中读取有问题的AngularJS模块的代码,该链接还包含示例应用程序的所有代码.

这是模块代码本身:

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;

    });
Run Code Online (Sandbox Code Playgroud)

附加信息:


基于@ okonyk的响应,我包含来自调用auth.authenticate()函数的不同MODULE的代码:

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

那么,如何从电话login()auth.authenticate($scope.credentials, function(authenticated)工作?function(authenticated)参数是否发送了一个确定内部功能的布尔值auth.authenticate()?如果是这样,你能明确吗?我可以把它拼凑起来.例如,true可能表示执行回调,而false可能表示注释要执行回调,但这有助于解释它. 通过单击此链接,您可以使用该login()方法读取示例应用程序中其他模块的代码.

oKo*_*nyk 7

这里有很好的解释:

回调函数(也称为高阶函数)是一个函数,它被传递给另一个函数(让我们将另一个函数"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)
Run Code Online (Sandbox Code Playgroud)

如果你运行它,它会打印: callback is being executed with passed parameter: 123456

回调模式通常用于处理JavaScript异步行为.

编辑:更具体的例子:

谈论你的代码片段......假设你将工厂注入控制器.

现在你auth.authenticate暴露了方法.你必须传递两个参数(credentials, callback).

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

我们只是传递匿名函数作为callback我们auth.authenticate方法的参数.

编辑:回应'附加信息':

看起来可能存在一些误解.你在问:

函数(已验证)参数是否发送了一个确定auth.authenticate()内部功能的布尔值

事情就是这样,完全相反:auth.authenticate()将值传递给'function(authenticated)',这是一个匿名函数.它发生在这一点上:callback && callback(auth.authenticated);- 开.successcallback && callback(false);- 开.error