2015-05-03 6 views
1

Я пытаюсь оценить выражение в операторе if, чтобы вернуть true или false. Оценка функции зависит от обещаний $http, из которых в документации много, поэтому я уверен, что смогу понять это.

Тем не менее, я заметил что-то странное в моей консоли, и, похоже, обратный вызов .success запускается дважды, поскольку консоль дважды выводит вывод из обратного вызова успеха (то есть the call was a success записывается дважды)!

Глядя на код, мое понимание было бы, что save() причины securityCheck.checkLogin() войти undefined, если заявление оценить ложь (тем самым войдя 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: http://plnkr.co/edit/tM7eHniDRvCLhzAw7Kzo?p=preview

Спасибо!

ответ

1

Ну удалить console.log(securityCheck.checkLogin()); и запрос будет выдан только один раз. Однако это всего лишь небольшая проблема с вашим кодом. Реальный заключается в том, что вы обрабатываете запрос AJAX, как если бы он был синхронным, однако это не так. checkLogin метод не возвращается 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"); 
     } 
     }); 
    } 
} 

Кроме того, необходимо сделать завод обратный метод обещание:

angular.module('security', []) 
.factory('securityCheck', ['$q', '$http', function ($q, $http) { 
    var security = { 
    checkLogin: function() { 
     return $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!'); 
       return data; 
      }) 
      .error(function(data, status, headers, config) { 
       console.log('the call had an error.'); 
      }); 
    } 
    }; 
    return security; 
}]); 

Демо:http://plnkr.co/edit/Kj8PkLMv3PsLfe9fsaRo?p=preview

2

Вы понимаете, вы вызываете метод checkLogin() дважды:

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

Это приводит к тому $http.get() будет выполняться два раза, и поэтому ваша success реализация.

+0

Неловко. Я не знал, что регистрация его на консоли приведет к ее выполнению. Спасибо за информацию. :-) –

+0

Вы регистрируете результат выполнения метода 'checkLogin()', и метод ничего не возвращает (в нем нет оператора возврата), это он регистрирует 'undefined'. – npe

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!'); 

Хотя различные команды, они оба возвращают то же значение