【发布时间】:2014-07-07 21:10:06
【问题描述】:
在我的节点 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 返回一个承诺,但有时它需要等待查询结果,有时它会立即解析,这取决于。
当第一个“checkThis”返回 false 时,有没有办法可以中断循环(如果还没有完成)?
【问题讨论】:
-
这超出了异步性的目的,不是吗?
-
正如thefourtheye 提到的,只有在每次请求后检查结果然后继续其他请求时,才能执行此操作。这会将您的异步代码转换为同步代码。我假设
checkThis函数向数据库(或其他远程服务器)发出请求。在这种情况下,只需发出一个具有所有检查权限的请求会更容易。在这种情况下,您可以在另一端进行优化。如果您不能更改另一端,那么恐怕您不会使该代码更有效率。 -
在这种情况下,不可能同时请求所有权限,因为每个权限(如果需要)都必须从数据库中找到一些不同的数据;所以在任何情况下,每个人的请求都会有所不同......
-
您可以尝试在您的 checkThis 中抛出异常。我想它会停止流动。但是无论如何,如果所有的 Promise 都已经运行,你几乎不会保存任何东西。如果 Promise 中的每个调用都需要大量资源,请考虑像前面提到的那样切换到同步调用。
标签: javascript node.js promise q