javascript promise in loop 或如何逐一调用函数
javascript promise in loop or how to call function one-by-one
我使用 slimerjs。所以我有一个带有 urls 和函数 (foo) 的数组,它用一个 url 来做某事。这个函数return 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);
}
与 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 无论如何应该更好。
我使用 slimerjs。所以我有一个带有 urls 和函数 (foo) 的数组,它用一个 url 来做某事。这个函数return 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);
}
与 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 无论如何应该更好。