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 无论如何应该更好。