angular $ http承诺被退回两次

时间:2015-05-03 19:47:56

标签: javascript angularjs angular-promise

我正在尝试评估if语句中的表达式以返回truefalse。该函数的评估取决于$http承诺,其中的文档很多 - 所以我有信心我可以解决这个问题。

但是,我注意到我的控制台有些奇怪,那就是.success回调似乎正在运行两次,因为控制台正在输出成功回调两次的输出(即the call was a success正在记录两次)!

从查看代码,我的理解是save()导致securityCheck.checkLogin()记录undefined,if语句评估为false(从而记录function returned false) ,然后承诺返回the call was a success一次记录。为什么要记录两次?

脚本

angular.module('login', ['security'])
.directive('loginDirective', ['$parse', 'securityCheck', function($parse, securityCheck) {
    return {
    scope: true,
    link: function(scope, element, attrs, form) {
      scope.save = function() {
        console.log(securityCheck.checkLogin());
           //evaluates to undefined, promise not returned yet
        if (securityCheck.checkLogin()) {
          console.log("function returned true");
        } else {
          console.log("function returned false");
        }
      }
    }
    };
}]);

angular.module('security', [])
.factory('securityCheck', ['$q', '$http', function ($q, $http) {
    var security = {
    checkLogin: function() {
        $http.get('https://api.mongolab.com/api/1/databases/lagrossetete/collections/avengers?apiKey=j0PIJH2HbfakfRo1ELKkX0ShST6_F78A')
            .success(function(data, status, headers, config) {
                console.log('the call was a success!');
            })
            .error(function(data, status, headers, config) {
                console.log('the call had an error.');
            });
    }
    };
    return security;
}]);

html

<html ng-app="login">
  <body>
    <login-directive ng-click="save()">click me</login-directive>
  </body>
</html>

plnkr:{{3}}

谢谢!

3 个答案:

答案 0 :(得分:2)

您确实意识到,您正在调用checkLogin()方法两次:

 console.log(securityCheck.checkLogin());
    //evaluates to undefined, promise not returned yet
 if (securityCheck.checkLogin()) {

这导致$http.get()执行两次,success实施也是如此。

答案 1 :(得分:1)

您可以在指令中调用console.log一次,然后再在工厂函数中调用。

// Here in the directive
scope.save = function() {    
    console.log(securityCheck.checkLogin());

// And then here in the service
.success(function(data, status, headers, config) {
            console.log('the call was a success!');

虽然命令不同,但它们都返回相同的值

答案 2 :(得分:1)

删除console.log(securityCheck.checkLogin());,请求只会发出一次。但是,这只是您的代码的一个小问题。真正的一个是你将AJAX请求视为同步,但事实并非如此。 <{1}}方法不返回checkLogin它返回promise对象,并且异步返回。

您应该检查true/false回调中的身份验证结果:

then

您还需要制作工厂方法返回承诺:

link: function(scope, element, attrs, form) {
  scope.save = function() {
      securityCheck.checkLogin().then(function(check) {
        if (check) {
          console.log("function returned true");
        } else {
          console.log("function returned false");
        }
      });
  }
}

演示: http://plnkr.co/edit/Kj8PkLMv3PsLfe9fsaRo?p=preview