javascript 中的语句不是 运行

Statements are not running sequentially in javascript

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

概览:

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

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

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 
    }
}

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

而不是

    unseenDates.forEach( range => {
         fetchData(range.start,range.end);
    });

尝试

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

你有两个地方做错了

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

    中调用它
  2. .forEach 循环不适用于 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 函数。