【问题标题】:Sequential loop, AngularJS Promises [duplicate]顺序循环,AngularJS Promises [重复]
【发布时间】:2018-11-21 07:57:53
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: javascript angularjs promise angular-promise


    【解决方案1】:

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

    【讨论】:

    • 如此简单的修复!非常感谢,效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2023-03-18
    • 1970-01-01
    • 2016-01-19
    • 2014-05-29
    • 2017-07-13
    相关资源
    最近更新 更多