Javascript JS中的嵌套循环获取请求
下面是我要做的事情的总结:Javascript JS中的嵌套循环获取请求,javascript,loops,asynchronous,nested,fetch,Javascript,Loops,Asynchronous,Nested,Fetch,下面是我要做的事情的总结: 使用accountId调用AOU-这将返回一个项目数组 我需要使用item.ReportDate再次调用AOU以获取项目 我将ReportDates映射到一个变量 我设置了一个名为projects的新空数组变量 循环查看ReportDates.Items并将这些项推送到项目中 现在,当I console.log projects时,它会显示一个项目列表,但是如果我尝试像projects[0]那样单独访问它们,它会返回未定义的项目。我假设这是由于它是异步的 如何访问已解
// First api call to retrieve ReportDates:
fetch(baseUrl + "api/Woh/Summary/" + accountId):
AccountId.Items: [
{
AccountId: 124,
clientName: XYZ,
reportDate: "2018-09-30"
},
{
AccountId: 124,
clientName: XYZ,
reportDate: "2018-09-20"
},
]
// Next using a loop to make fetch calls using reportDates:
fetch(baseUrl + "api/Woh/Details/" + accountId + "/" + reportDate)
reportDate.Items(first loop):
[
{a:y},
{b:z},
{c:v}
]
reportDate.Items(second loop):
[
{a:y},
{b:z}
]
现在我尝试将每个调用中的所有项都推送到一个数组中。这就是我在循环完成后无法访问的地方
这是我的密码:
const getProjectsData = async () => {
let projectsData = await fetch(baseUrl + "api/Woh/Summary/" + accountId);
let projectsJson = await projectsData.json();
let reportDates = projectsJson.Items.map(item => formatDate(item.ReportDate));
let projects = [];
reportDates.forEach(reportDate => {
fetch(baseUrl + "api/Woh/Details/" + accountId + "/" + reportDate)
.then(res => res.json())
.then(data => {
data.Items.forEach(item => projects.push(item));
})
});
console.log(dates);
// console logging dates shows the array of items that I want, but when I try to access them individually with dates[0], it shows as undefined.
}
如果您使用
async/await
,您就不必太费劲地考虑循环。可以使用for块循环,如下所示:
async function getResults(objs) {
const responses = [];
for (let obj of objs) {
const response = await fetch(`/data/${obj.id}`);
const json = await response.json();
responses.push(json);
}
return responses;
}
getResults([{id:1},{id:2}])
这回答了你的问题吗?嘿,谢谢你的回答。这真的很接近!除了我需要在第一个循环之后再做一步之外,所以它实际上看起来更像这样:异步函数getResults(objs){const responses=[];for(让objs的obj){const response=await fetch(
/data/${obj.id}
);const json=await response.json();json.Items.forEach(item=>responses.push(item));}console.log(responses);return responses;}-控制台日志显示了正确的数组,但返回结果显示了未定义,异步函数隐式返回一个承诺,因此使用getResults()获取数据。然后(res=>console.log(res))
@ScottAu-fubar是正确的,异步函数返回承诺。您可以等待它,constresults=await getResult()
,或者使用。然后
回调