Javascript在数组上逐个执行异步任务

Javascript在数组上逐个执行异步任务,javascript,arrays,reactjs,react-native,promise,Javascript,Arrays,Reactjs,React Native,Promise,我有一个url数组: var myurls = ["url1", "url2", "url3"]; 我想一个接一个地获取所有URL 我知道如何手动执行此操作,但不知道如何对阵列执行此操作 fetchUrl1(myurls[0]) .then(function(){ return test_func(myurls[1]); }) .then(function(){ return test_func(myurls[2]); }) .then(function()

我有一个url数组:

var myurls = ["url1", "url2", "url3"];
我想一个接一个地获取所有URL

我知道如何手动执行此操作,但不知道如何对阵列执行此操作

fetchUrl1(myurls[0])
  .then(function(){
    return test_func(myurls[1]);
  })
  .then(function(){
    return test_func(myurls[2]);
  })
  .then(function() {
     console.log('done');
   });

我如何动态地做到这一点

评论中似乎有一些重复的候选者,但这里有一个简明的答案,根据具体要求提供了几种方法:

如果要使用节点样式的回调,可以使用asyncjs;如果要使用Promissions来获取串联的URL,则可以使用bluebird。如果您不需要以串联方式进行抓取,但它们都可以以并行方式进行抓取,asyncjs的each和ES6的Promise.all将允许您这样做

这两种方法都将函数作为输入,因此您将获取原始URL数组并将它们映射到所需的输入函数,最终输出将是一个结果数组我假设URL获取的响应

编辑:包括带有Promise.each的示例代码

var myurls = ["url1", "url2", "url3"];
var myPromisifiedFetchRequests = myurls.map(url => fetch(url));

Promise.each(myPromisifiedFetchRequests).then(myFetchedResults => console.log(myFetchedResults));

你可以用这样的东西。它构建了一个承诺链,将按照原始数组的顺序解析所有结果的数组。如果您想玩它,这里有一个JSFIDLE:


你想调用相同的函数还是不同的函数来获取URL?请参阅此StackOverflow帖子:@JeffHuijsmans的可能副本我认为是一个更好的复制目标。可能副本感谢你的回答这是非常具体的,因为我想使用fetch,我将尝试使用Promise.each并更新你,你有Pormise.each的例子吗?我在react Native上更新了我的答案,提供了如何使用Promise.each的示例代码。如果您有任何其他问题,请告诉我。感谢您的回复。我有一个类型错误:Promise。每个都不是函数
//dummy http.get
function HttpGet(url) {
  return new Promise((resolve, reject) => {
    console.log(`fetching ${url}`);
    setTimeout(function(){
        resolve(`done: ${url}`);
    }, Math.floor(Math.random()*500));
  });
}

function buildPromiseChain(items, func) {
  var promise = new Promise((resolve, reject) => {
    resolve([]);
  });
  items.forEach((item) => {
    promise = promise.then((result) => {
      return func(item).then((itemResult) => {
        result.push(itemResult);
        return result;
      });
    });
  });
  return promise;
}

buildPromiseChain(myurls, HttpGet).then((results) => console.log('done', results));