我试图弄清楚如何在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 。
有人可以告诉我我想念什么吗?
答案 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);