语句未在 javascript 中按顺序运行

用户14283908

当我运行以下 searchSessionData 函数时,日志语句按以下顺序打印 - 1,3,4,5,2 而不是 1,2,3,4,5。

概述:

searchSessionData基本上找到看不见的日期范围,然后使用该范围调用该fetchData函数,然后它只是在控制台中打印。

fetchData使用日期并获取数据并将它们全部推送到 adataMap => it is a map并将数据返回

async function searchSessionData(sdate,edate){
    var data;
    // get range
    var unseenDates=getUnseenDates(new Date(sdate),new Date(edate));
    unseenDates.forEach( range => {
         fetchData(range.start,range.end);
    });
    // weave all data
    console.log(3);
    data=[];
    var allDatesinrange= getAllDates(new Date(sdate), new Date(edate));
    console.log(4);
    printElements(allDatesinrange);
    console.log(5);
}

// fetch data from the API and stores it to the hashmap
const fetchData = async(sdate='', edate='')=>{
    try {
        // console.log('fetching...')
        var response;
        var data;

        // send requests to fetch data from api
        console.log(1);
        response = await fetch(`${APOD_url}${api_key}${startDate}${sdate}${endDate}${edate}`)
        currentDataIndex=0;
        data = await response.json();
        //if data is array, enter data to map for each entry
        // console.log(dataMap);
        data.forEach(async element => {
            await dataMap.set(element.date),element);
        });
        console.log(2);

        return data;
    } catch (error) {
        console.log(error)
        return 
    }
}

任何人都知道问题是什么以及如何解决?我不太确定,但我认为这可能是由于承诺。

赞美诗

你在两个地方做错了

  1. fetchData是一个async函数,但您通常在searchSessionData

  2. .forEachloop 不适用于async/await组合,并且您在两个地方使用它。

要解决此问题并需要更改您的两个.forEach功能,如下所示:

for ( range of unseenDates ) {
     await fetchData(range.start,range.end);
};

for ( element of data ) {
    await dataMap.set(element.date),element);
};

await Promise.all如果循环中的函数不需要按顺序触发,您甚至可以考虑使用函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章