【问题标题】:How to loop over an array of objects and fetch network data for each one in JS?如何在 JS 中遍历一组对象并为每个对象获取网络数据?
【发布时间】:2018-07-27 12:13:17
【问题描述】:

我正在使用 React Native 制作应用程序。我必须从 URL 中获取一组类别的数据,然后对于每个类别,我必须从它们各自的 URL 中获取资产。这是我已经走了多远:

var result = fetch(url)
  .then((response) => response.json())
  .then((jsonData) => {
    for (var i = 0; i < jsonData.result.length; i++) {
        var url = jsonData.result[i];
        if (url.name == 'navigationURL') {
          return fetch(url.value);
        }
    }
  })
  .then((response) => response.json())
  .then((jsonData) => {
    let categories = [];
    for (var i = 0; i < jsonData.subCategories.length; i++) {
        var cat = jsonData.subCategories[i];
        console.log(Category);
        var category = new Category(cat.id, cat.name, cat.type, cat.url, []);
        console.log(category);
        categories.push(category);
    }
    return categories;
  })

我的数据以以下格式存储:

来自主网址:

{
  "status": "success",
  "result": [
    {
      "name": "navigationURL",
      "value": "xxx"
    }
  ]
}

来自navigationURL

{
  "id": 1,
  "name": "Home",
  "type": "",
  "url": "",
  "subCategories": [
    {
      "id": 92,
      "name": "Documentary",
      "type": "JTV_LEAF",
      "url": "yyy",
    }
  ]
}

来自每个类别的 URL,

[
  {
    "id": "1",
    "title": "Inception",
    "type": "vod"
  }
]

如何获取每个类别的数据?


这是我目前所写的:

var result = fetch(url)
.then((response) => response.json())
.then((jsonData) => {
  for (var i = 0; i < jsonData.result.length; i++) {
      var url = jsonData.result[i];
      if (url.name == 'navigationURL') {
        return fetch(url.value);
      }
  }
})
.then((response) => response.json())
.then((jsonData) => {
  let categories = [];
  for (var i = 0; i < jsonData.subCategories.length; i++) {
      var cat = jsonData.subCategories[i];
      var category = new Category(cat.id, cat.name, cat.type, cat.url);
      categories.push(category);
  }
  return categories;
})
.then((categories) => {
  console.log(categories);
  return Promise.all(
    categories.map(category => {
      fetch(category.url)
        .then(res => res.json())
        .then((assetsJson) => {
          let assets = [];
          for (var i = 0; i < assetsJson.length; i++) {
              var ass = assetsJson[i];
              var asset = new Asset(ass.id, ass.title, ass.type, ass.thumbnail);
              assets.push(asset);
          }
          return assets;
        })
        .then((assets) => category.assets = assets);
    })
  ).then((categories) => {
    this.setState({
      isLoading: false,
      dataSource: categories,
    }, function(){

    });
  });
})

.catch((error) =>{
  console.error(error);
});

【问题讨论】:

  • 更好用.map()

标签: javascript reactjs react-native fetch


【解决方案1】:

在运行链中的下一个 then 函数之前,您可以使用 Promise.all 确保每个 fetch 都已完成。

示例

var result = fetch(url)
  .then(response => response.json())
  .then(jsonData => {
    return Promise.all(
      jsonData.result.map(url => {
        if (url.name === "navigationURL") {
          return fetch(url.value).then(res => res.json());
        }
      })
    );
  })
  .then(jsonData => {
    return jsonData.reduce((result, data) => {
      if (data) {
        data.subCategories.forEach(cat => {
          var category = new Category(cat.id, cat.name, cat.type, cat.url, []);
          result.push(category);
        });
      }

      return result;
    }, []);
  });

【讨论】:

  • 您的代码不正确。它从原始 url 而不是类别中包含的 url 获取。
  • @khateeb 不,它没有。它在给map的函数中创建一个新的url变量:jsonData.result.map(url =&gt; { ... })
  • 您的代码不适合我。我仍然要让它工作。我得到这个作为最终结果。 Promise { "_40": 0, "_55": null, "_65": 0, "_72": null, } [未处理的承诺拒绝:TypeError: undefined is not an object (evalating 'jsonData.subcategories.reduce')] * App.js:27:38 in - node_modules\promise\setimediate\core.js:37:14 in tryCallOne - node_modules\promise\setimediate\core.js:123:25 in - ...来自框架内部的另外 10 个堆栈帧
  • @khateeb 我更新了答案以使用subCategories 而不是subcategories
  • 不,不是这样。我仍然认为您在原始 URL 中的数据上使用了 Promises.all,而不是每个类别中存在的 url。
猜你喜欢
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 2021-12-21
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
相关资源
最近更新 更多