Javascript 如何在JS中循环一组对象并获取每个对象的网络数据?
我正在用React Native制作应用程序。我必须从一个URL获取一组类别数据,然后对于每个类别,我必须从它们各自的URL获取资产。这就是我取得的成绩: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
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;
}, []);
});