由AngularJS中的逗号分隔的函数

时间:2015-12-23 17:21:45

标签: javascript angularjs

我正在使用本文进行AngularJS身份验证:https://medium.com/opinionated-angularjs/techniques-for-authentication-in-angularjs-applications-7bbf0346acec#.y7nkgrxqo

在文章中,他们提出了:

.controller('LoginController', function ($scope, $rootScope, AUTH_EVENTS, AuthService) {
  $scope.credentials = {
    username: '',
    password: ''
  };
  $scope.login = function (credentials) {
    AuthService.login(credentials).then(function (user) {
      $rootScope.$broadcast(AUTH_EVENTS.loginSuccess);
      $scope.setCurrentUser(user);
    }, function () {
      $rootScope.$broadcast(AUTH_EVENTS.loginFailed);
    });
  };
})

$ scope.login中的.then有两个用逗号分隔的函数---这是什么意思?

3 个答案:

答案 0 :(得分:2)

$scope.login只有一个函数,then()有两个函数,如

promise.then(function(value) {
     // fulfillment
  }, function(reason) {
     // rejection
});

履行承诺时会调用第一个函数。该函数有一个参数,即履行值。

拒绝承诺时调用第二个函数。这个函数有一个参数,即拒绝原因。

Promise.then()

答案 1 :(得分:0)

如果仔细阅读,可以看到$scope.login只有一个功能。但登录的Promise.then回调有2个,一个用于成功,一个用于失败。如果登录成功,将调用第一个,如果login失败,则调用第二个。

AuthService
    .login(credentials)
    .then(
        // 1st callback (success)
        function (user) {
            // Login succeeded
            $rootScope.$broadcast(AUTH_EVENTS.loginSuccess);
            $scope.setCurrentUser(user);
        }, 
        // 2nd callback (failure)
        function () {
            // Login failed
            $rootScope.$broadcast(AUTH_EVENTS.loginFailed);
        }
    );

答案 2 :(得分:0)

============概念一,作为参数起作用=================

这不是一个Angular功能,它只是简单的javascript。 Javascript将接受任何作为函数的参数,包括其他函数。 这是一种快速分解的方法:

function ryu(){
    console.log('hadouken!');
}
function ken(){
    console.log('shoryuken!');
}
function fight(x,y){
    x();
    y();
}

fight(ryu,ken);

与:

相同
fight(function(){
    console.log('hadouken!');
},function(){
    console.log('shoryuken!');
});

============概念二,承诺=================

每个人在其他答案中谈论的承诺只是一个加分。承诺是一种“先发制人”的奇特方式。做出承诺的快速而肮脏的方式是:

让我们说在战斗发生之前,一个人必须宣布它。

function announce(fight,a,b){
    console.log('3,2,1 fight!');
    //fight will happen after 3 seconds
    setTimeout(function(){
        fight(a,b)
    },3000);
}

//then you run it
annount(fight,ryu,ken);