Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.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_Loops_Asynchronous_Nested_Fetch - Fatal编程技术网

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]那样单独访问它们,它会返回未定义的项目。我假设这是由于它是异步的 如何访问已解

下面是我要做的事情的总结:

  • 使用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()
    ,或者使用
    。然后
    回调