我想写三个for循环,承诺如下:
for i = 1 .. 3
for j = 1 .. 5
for k = 1 .. 6
post call to db to check if there is item on location i, j, k
我搜索了类似的问题,但我只获得了一维数组循环示例。
我发现这个问题很难,我希望你们能帮助我。感谢。
答案 0 :(得分:0)
$locations = [
[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4],
....
];
然后,您可以轻松地遍历此阵列并管理您的承诺。希望这有帮助
答案 1 :(得分:0)
你不能将同步for
循环与异步操作结合起来,并使事情正确排序,因为无法进行for
循环"等待&# 34;承诺完成。 for
循环同步运行,因此它将立即启动所有异步操作。
所以,相反,你必须以另一种方式进行迭代。如果你只迭代一个参数,那么会有很多现成的方法可以做到这一点,但是我不知道任何用于迭代三个嵌套变量的预构建解决方案,所以你必须构建自己的。这是实现目标的一种方法。此方法是针对您的迭代自定义编码的,这使得它的代码比通用方案少一些:
// fn gets called like this fn(i, j, k) and must return a promise
function iterateLevels(fn) {
var i = 1, iMax = 3;
var j = 1, jMax = 5;
var k = 1, kMax = 6;
function next() {
if (k > kMax) {
j++;
k = 1;
}
if (j > jMax) {
i++;
j = 1;
}
if (i > iMax) {
return;
}
return fn(i, j, k).then(function(result) {
k++;
// process result here
// if you want to continue processing, then
return next();
});
}
return next();
}
这是一个使用带有随机延迟的承诺的有效演示实现:https://jsfiddle.net/jfriend00/q2Lnhszt/
外部作用域变量next()
,i
和j
的{{1}}函数本质上是一个状态机,每次调用k
时它运行下一次迭代并更新其状态。
这可以是通用的,因此您可以传递多少级别的迭代以及每个级别的起始值和停止值,并且您可以传入一个函数来处理结果。使其成为通用会为实现添加更多代码,并使逻辑更难以遵循。