在我的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
});
这是一种更通用的方法-对异常情况使用异常管道可以大大简化代码。