链angularjs循环与承诺

时间:2015-12-26 10:19:39

标签: javascript loops angular-promise

我正在构建我的第一个离子/角度。我的应用程序由几个连续的阶段组成,每个阶段都有一个DB查询来搜索模式。所以每个阶段基本上都是一个while循环,在db发现模式时会中断。在this post之后我有一个承诺的承诺。我在循环链接时遇到问题。

Utils.promiseWhile = function(condition, body) {
  var done = $q.defer(); //also tried: new $q.defer();
  function loop() {
    if (!condition()) return done.resolve();
    $q.when(body(), loop, done.reject);
  }
  setTimeout(loop, 1);
  return done.promise;
}

单个while循环按预期工作,从异步数据库返回11个txt条目。此示例中的循环条件只是循环计数,为简单起见,我删除了实际模式代码。记录的控制台是:L1:0,L1:1,..,L1:12,done1。那很好。

问题显示我链接循环:

var idx1 = 0;
var idx2 = 0;
var idx3 = 0;
var txt ='';
Utils.promiseWhile(
    function () { console.log("L1: "+idx1); return idx1 <= 11;},
    function () {
    idx1++;
    return MYDB.txt(idx1,1)
            .then(function(t){txt += (' '+t);});
})
.then(function () {
    console.log("done1");
    Utils.promiseWhile(
        function () { console.log("L2: "+idx2); return idx2 <= 11;},
        function () {
        idx2++;
        return MYDB.txt(idx2,1)
                .then(function(t){txt += (' '+t);});
    })
})  
.then(function () {
    console.log("done2");
    Utils.promiseWhile(
        function () { console.log("L3: "+idx3); return idx3 <= 11;},
        function () {
        idx3++;
        return MYDB.txt(idx3,1)
                .then(function(t){txt += (' '+t);});
    })
})
.then(function(){
    console.log("done3");
});

意外的输出是:

L1: 0
L1: 1
L1: 2
L1: 3
L1: 4
L1: 5
L1: 6
L1: 7
L1: 8
L1: 9
L1: 10
L1: 11
L1: 12
done1
done2
done3
L2: 0
L3: 0
L2: 1
L3: 1
L2: 2
L3: 2
L2: 3
L3: 3
L2: 4
L3: 4
L2: 5
L3: 5
L2: 6
L3: 6
L2: 7
L3: 7
L2: 8
L3: 8
L2: 9
L3: 9
L2: 10
L3: 10
L2: 11
L3: 11
L2: 12
L3: 12

为什么L2和L3并行运行?

1 个答案:

答案 0 :(得分:1)

一个问题是你的外then s不会返回任何承诺。

直到现在我才相信你会得到未解决的承诺,但是由于你观察到并行运行的任务,这是不可能的。

另一个问题是,当你混合嵌套和链接的承诺时,很难看到你想要做什么。为什么首先需要promiseWhile