顺序循环,AngularJS Promises

Sequential loop, AngularJS Promises

我想弄清楚如何在 for 循环中一个接一个地解决任意数量的承诺。

我有一个名为 scrapePage(num) 的函数,它接受一个数字并对某个网页进行 HTTP 调用。 我已经尝试了很多方法来解决这个问题。

1) 使用一组承诺(以随机顺序解析它们):

var promises = [];
   for (var i = 0; i < 4; i++) {
   promises.push(scrapPage(i));
}
$q.all(promises).then(doMoreThings);

2) 使用调用链(对于任意数量的调用是无用的):

var chain = $q.when();
chain.then(function() {
    return scrapPage(0);
}).then(function() {
    return scrapPage(1);
}).then(function() {
    return scrapPage(2);
}).then(function() {
    return scrapPage(3);
}).then(doMoreThings);

我正在研究链函数,试图让它发挥作用。出于测试目的,我让 scrapePage 每次解析时打印出 "page #n"。

这是我现在拥有的:

var chain = $q.when();
for (var i = 0; i < 4; i++) {
    console.log("i: " + i);
    chain = chain.then(function() {
        console.log("\ni: " + i);
        return scrapPage(i);
    });                 
}    

我可以指出它有两个主要问题。

首先,它的输出非常奇怪。

i: 0
i: 1
i: 2
i: 3

i: 4
page #4

i: 4
page #4

i: 4
page #4

i: 4
page #4

其次,我不知道如何在所有承诺都解决后doMoreThings

谁能告诉我我错过了什么?

尝试将 var 更改为 let

var chain = $q.when();
for (let i = 0; i < 4; i++) {
    console.log("i: " + i);
    chain = chain.then(function() {
        console.log("\ni: " + i);
        return scrapPage(i);
    });                 
}

这可能会解决第一个问题。

对于第二个,您可以添加这样的条件:

if (i == 4){
    doMoreThings();
}
else {
    return scrapPage(i);
}

而不只是 return scrapPage(i);