对于有承诺的循环

时间:2016-06-24 22:39:32

标签: angularjs node.js

我想写三个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
  • 第1步:检查1,1,1
  • 第2步:检查1,1,2项是否已找到或包含下一个索引
  • ...

我搜索了类似的问题,但我只获得了一维数组循环示例。

我发现这个问题很难,我希望你们能帮助我。感谢。

2 个答案:

答案 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()ij的{​​{1}}函数本质上是一个状态机,每次调用k时它运行下一次迭代并更新其状态。

这可以是通用的,因此您可以传递多少级别的迭代以及每个级别的起始值和停止值,并且您可以传入一个函数来处理结果。使其成为通用会为实现添加更多代码,并使逻辑更难以遵循。