我正在构建我的第一个离子/角度。我的应用程序由几个连续的阶段组成,每个阶段都有一个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并行运行?
答案 0 :(得分:1)
一个问题是你的外then
s不会返回任何承诺。
直到现在我才相信你会得到未解决的承诺,但是由于你观察到并行运行的任务,这是不可能的。
另一个问题是,当你混合嵌套和链接的承诺时,很难看到你想要做什么。为什么首先需要promiseWhile
?