顺序循环,AngularJS承诺

时间:2018-11-21 07:57:54

标签: javascript angularjs promise angular-promise

我试图弄清楚如何在for循环中一个接一个地解决任意数量的Promise。

我有一个名为 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 每次解决时都打印出“页面#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

有人可以告诉我我想念什么吗?

1 个答案:

答案 0 :(得分:0)

尝试将 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);

相关问题