顺序循环,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);
我想弄清楚如何在 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);