我有以下JavaScript函数,它将循环遍历3个对象的数组,每次满足if语句的条件并返回true。为什么它在第一次命中后才返回,而是继续循环遍历数组?这当然导致函数返回false,因为它在循环之后命中。
我只是通过创建一个不同的变量并在最后返回它来解决这个问题,但我只是好奇它为什么会这样做?
this.CheckRoles = function (authLevel) {
angular.forEach(currentUser.roles, function (role) {
if(role >= authLevel)
{
//The user has the required permissions
return true;
}
});
return false;
}
答案 0 :(得分:2)
您从传递回angular.forEach
的回调中返回,而不是从CheckRoles
功能返回。
就像原生forEach
(与jQuery' s each
不同),没有干净的方法来阻止angular.forEach
循环。如果您使用脏解决方案,或者只是使用标准循环,则可能会抛出异常:
this.CheckRoles = function (authLevel) {
for (var i=0; i<currentUser.roles.length; i++) {
var role = currentUser.roles[i];
if (role >= authLevel) {
//The user has the required permissions
return true; // really return, don't iterate over other roles
}
}
return false;
}
如果您仍想使用angular.forEach
(因此遍历整个数组),则必须确保传递该值:
this.CheckRoles = function (authLevel) {
var ok = false;
angular.forEach(currentUser.roles, function (role) {
if(role >= authLevel) {
//The user has the required permissions
ok = true;
}
});
return ok;
}
如果您不需要支持IE8,那么使用some是一个非常干净有效的解决方案:
this.CheckRoles = function (authLevel) {
return currentUser.roles.some(function(role){
return role >= authLevel;
});
}
答案 1 :(得分:2)
因为你从forEach回调函数返回NOT而不是从外部CheckRoles函数返回。
答案 2 :(得分:0)
真正的返回从内部函数返回而不是外部函数。对于每个迭代循环,这不是常规的,循环体的返回将从函数返回。做你打算做的事情的方法是在内部函数中设置一个变量并从外部函数返回它。