javascript承诺在循环中或如何逐个调用函数

javascript承诺在循环中或如何逐个调用函数,javascript,loops,asynchronous,promise,Javascript,Loops,Asynchronous,Promise,我和苗条的J一起工作。所以我有一个带有url的数组和函数(foo),它用一个url生成一些东西。此函数返回承诺 如果我这样做没关系: foo(urls).then(foo, orError).then(foo, orError)..... 但我想在循环中调用foo(),所以我尝试以下方法: for ( var i = 0; i < urls.length; i++ ) { foo(urls).then(foo, error); } 这是我的循环 for ( var i = 0; i

我和苗条的J一起工作。所以我有一个带有url的数组和函数(foo),它用一个url生成一些东西。此函数返回承诺

如果我这样做没关系:

 foo(urls).then(foo, orError).then(foo, orError).....
但我想在循环中调用foo(),所以我尝试以下方法:

for ( var i = 0; i < urls.length; i++ ) { foo(urls).then(foo, error); }
这是我的循环

for ( var i = 0; i < urls.length; i++ ) {
    visitPage(urls)
      .then(visitPage, showError);
}
for(var i=0;i
类似的技术是通过实际的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进行变异,这应该会更好。

您想做什么?只是异步访问URL吗?
queue
不等于循环返回的最后一个
Promise
?当你在评论中说
此处全部完成
@SuhailGupta是的,他的意思是,一旦你传递给最后一个then块的函数被调用,这意味着所有URL都已经以串行方式命中。作为补充,您可以添加catch块来处理错误。
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
});