我正在尝试评估if语句中的表达式以返回true
或false
。该函数的评估取决于$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}}
谢谢!
答案 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");
}
});
}
}