Fil*_*off 2 javascript loops asynchronous promise
我和slimerjs一起工作.所以我有一个带有url和function(foo)的数组,用一个url创建一个东西.这个函数返回Promise.
如果我做这样的事情就没关系:
foo(urls).then(foo, orError).then(foo, orError).....
Run Code Online (Sandbox Code Playgroud)
但是我想在循环中调用foo(),所以我试试这个:
for ( var i = 0; i < urls.length; i++ ) { foo(urls).then(foo, error); }
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
也许我不需要承诺,我不知道.
如何在循环中调用异步函数,但等到函数完成?
这是我的"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);
});
});
}
Run Code Online (Sandbox Code Playgroud)
这是我的循环
for ( var i = 0; i < urls.length; i++ ) {
visitPage(urls)
.then(visitPage, showError);
}
Run Code Online (Sandbox Code Playgroud)
类似于我在这里的回答,该技术是通过实际的for循环或a来链接动作本身.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
});
Run Code Online (Sandbox Code Playgroud)
你可以改为visitPage
只拿一个url而不是mutate url,无论如何都应该更好.