Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在JS中循环一组对象并获取每个对象的网络数据?_Javascript_Reactjs_React Native_Fetch - Fatal编程技术网

Javascript 如何在JS中循环一组对象并获取每个对象的网络数据?

Javascript 如何在JS中循环一组对象并获取每个对象的网络数据?,javascript,reactjs,react-native,fetch,Javascript,Reactjs,React Native,Fetch,我正在用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 = jso

我正在用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;
  })
导航URL

{
  "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);
});
var result=fetch(url)
.then((response)=>response.json())
.然后((jsonData)=>{
for(var i=0;iresponse.json())
.然后((jsonData)=>{
设类别=[];
对于(var i=0;i{
控制台日志(类别);
回报你的承诺(
categories.map(category=>{
获取(category.url)
.then(res=>res.json())
.然后((assetsJson)=>{
让资产=[];
对于(var i=0;icategory.assets=资产);
})
)。然后((类别)=>{
这是我的国家({
孤岛加载:false,
数据源:类别,
},函数(){
});
});
})
.catch((错误)=>{
控制台错误(error);
});
在运行链中的下一个
然后
功能之前,您可以使用确保每个
提取
都已完成

示例

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;
    }, []);
  });

最好使用
.map()
您的代码不正确。它从原始url获取,而不是从类别中包含的url获取。@khateeb不,它不是。它在给
map
的函数中创建了一个新的
url
变量:
jsonData.result.map(url=>{…})
您的代码对我不起作用。我还是要让它工作。我把这个作为最终结果。承诺{“_40”:0,“_55”:null,“_65”:0,“_72”:null,}[未处理的承诺拒绝:类型错误:未定义不是对象(评估'jsonData.subcategories.reduce')]*App.js:27:38 in-node_modules\Promise\setimmediate\core.js:37:14 in-tryCallOne-node_modules\Promise\setimmediate\core.js:123:25 in-。。。框架中还有10个堆栈帧internals@khateeb我将答案更新为使用
子类别
而不是
子类别
。不,不是这样。我仍然认为您使用了Promissions.all,它基于原始URL中的数据,而不是每个类别中的URL。
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;
    }, []);
  });