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

时间:2017-05-23 14:14:55

标签: javascript arrays reactjs react-native promise

我有一个url数组:

var myurls = ["url1", "url2", "url3"];

我想逐个获取所有网址。

我知道如何手动完成,但不知道数组

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

我如何动态地做到这一点?

2 个答案:

答案 0 :(得分:-1)

在评论中看起来有一些重复的候选人,但是这里有一个简明的答案,根据具体要求提供了几种方法:

如果使用promises来获取串联的URL,则可以使用asyncjs'eachSeries(如果要使用节点式回调)或bluebird的Promise.each。如果你不需要系列中的提取,但它们都可以并行获取,asyncjs'each和ES6的Promise.all将允许你这样做。

这两种方法都将函数作为输入,因此您可以将原始URL数组和map它们放到所需的输入函数中,最终输出将是一个结果数组(我假设响应来自URL提取)。

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

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

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

答案 1 :(得分:-1)

你可以使用这样的东西。它构建了一系列promise,它将以原始数组的顺序解析所有结果的数组。如果你想玩它,这就是一个JSFiddle:https://jsfiddle.net/53r4oxyh/

//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));