【问题标题】:AngularJS function returning at wrong pointAngularJS函数在错误点返回
【发布时间】:2015-05-13 10:39:14
【问题描述】:

我有以下 JavaScript 函数,它将遍历一个由 3 个对象组成的数组,每次都满足 if 语句的条件并返回 true。为什么它在第一次达到 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;
}

【问题讨论】:

  • This answer 应该可以解决您的问题。
  • 您可以在 forEach 方法中设置一个标志而不是 return 并在循环外(之后)检查标志并根据您的要求返回 true/false。

标签: javascript arrays angularjs


【解决方案1】:

您是从传递给 angular.forEach 的回调中返回的,而不是从 CheckRoles 函数中返回的。

就像原生的forEach(与jQuery 的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;
    });
}

【讨论】:

  • 第二种方法是我用来绕过它的方法。感谢您的明确解释。
【解决方案2】:

因为您是从 forEach 回调函数返回,而不是从外部 CheckRoles 函数返回。

【讨论】:

    【解决方案3】:

    真正的返回是从内部函数而不是外部函数返回的。这不是每个迭代循环的常规,循环体的返回将从函数返回。做你想做的事情的方法是在内部函数中设置一个变量并从外部函数返回它。

    【讨论】:

      猜你喜欢
      • 2017-01-04
      • 2023-04-01
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 2013-10-21
      • 2014-07-24
      • 2021-12-13
      • 2021-05-10
      相关资源
      最近更新 更多