我使用slimerjs。所以我有一个带有url和function(foo)的数组,用一个url创建一个东西。这个函数返回Promise。
如果我这样做,那就没关系了:
foo(urls).then(foo, orError).then(foo, orError).....
但是我想在循环中调用foo(),所以我试试这个:
for ( var i = 0; i < urls.length; i++ ) { foo(urls).then(foo, error); }
但它不起作用。
也许我不需要承诺,我不知道。
如何在循环中调用异步函数,但等到函数完成?
这是我的“foo”功能:
function visitPage(urls) {
return new Promise(function(success, error) {
var url = urls.shift();
if (!url) error();
logger.log("Opening " + url);
page
.open(url)
.then(function(status) {
if (status !== "success") error();
return page.evaluate(function() {
return document.body.innerHTML;
});
}).then(function(body) {
var founded = looker.lookForAlpari(body);
logger.log(founded);
page.close();
success(urls);
});
});
}
这是我的循环
for ( var i = 0; i < urls.length; i++ ) {
visitPage(urls)
.then(visitPage, showError);
}
答案 0 :(得分:6)
与my answer here类似,该技术是通过实际for循环或.reduce
来链接动作本身。既然你要求for循环让我们坚持下去:
var queue = Promise.resolve(); // start waiting
urls.forEach(function(url){
queue = queue.then(function(result){
// put result somewhere
return visitPage(url);
});
});
queue.then(function(){
// all done here
});
你可以改变visitPage
只取一个url而不是改变url,无论如何都应该更好。