在我的node js应用程序中,我有一个检查您是否有权限的函数:

//queryPermissions is an object that contains all possible permissions:
//each property of queryPermission is an object containing the values to be checked
for (var key in queryPermissions) {
    if (queryPermissions.hasOwnProperty(key)) {
        promisesArray.push(checkThis(key, req.method));
    }
}

Q.all(promisesArray).then(function(response) {
    response.forEach(function(value) {
        //response is an array with all promises' resolved values
        //if all values are true -> access granted
        //if one or more values are false -> access denied
    }
}

这很好,但是如果for循环中checkthis返回的值中只有一个是false,那么结果将是拒绝访问;
因此,在第一个解析为false的权限之后继续检查其他权限是不有效的;
checkthis返回一个promise,但有时它需要等待查询结果,有时它会立即解决,这取决于。
当第一个“checkthis”返回false时,有没有办法中断循环(如果还没有完成的话)?

最佳答案

以下是Bergi方法的另一种解决方案-我们将假返回值映射到异常情况下的故障,并直接使用Q.all
您当前的代码:

for (var key in queryPermissions) {
    if (queryPermissions.hasOwnProperty(key)) {
        promisesArray.push(checkThis(key, req.method));
    }
}

我们添加了一个附加步骤:
for (var key in queryPermissions) {
    if (queryPermissions.hasOwnProperty(key)) {
        promisesArray.push(checkThis(key, req.method).then(function(val){
             if(!val) throw new Error("Invalid Permissions");
             return true;
        });
    }
}

这个简单的加法可以让我们直接使用q:
Q.all(promisesArray).catch(function(err){
     // one or more authentication errors
}).then(function(){
      // everyone validated, all ok user authenticated here
});

这是一种更通用的方法-对异常情况使用异常管道可以大大简化代码。

10-08 03:44