【问题标题】:Javascript execute async task one by one on arrayJavascript在数组上一一执行异步任务
【发布时间】:2017-10-23 13:16:01
【问题描述】:

我有一个 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');
   });

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

【问题讨论】:

标签: javascript arrays reactjs react-native promise


【解决方案1】:

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

你可以使用 asyncjs 的 eachSeries(如果你想使用节点样式的回调)或 bluebird 的 Promise.each 如果使用 Promise 来获取一系列 URL。如果您不需要串行获取,但它们都可以并行获取,那么 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));

【讨论】:

  • 感谢您的回答,这非常具体,因为我想使用 fetch
  • 我会尝试 Promise.each 并更新你,你有 Pormise.each 的例子吗?
  • 我正在响应原生
  • 我更新了我的答案以提供有关如何使用 Promise.each 的示例代码。如果您有任何其他问题,请告诉我。
  • 感谢 react native 我有一个类型错误:Promise.each 不是函数
【解决方案2】:

你可以使用这样的东西。它构建了一个 Promise 链,这些 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));

【讨论】:

    猜你喜欢
    • 2016-05-22
    • 2017-08-21
    • 2018-03-30
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    相关资源
    最近更新 更多