当我运行以下 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
}
}
任何人都知道问题是什么以及如何解决?我不太确定,但我认为这可能是由于承诺。
你在两个地方做错了
fetchData
是一个async
函数,但您通常在searchSessionData
.forEach
loop 不适用于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] 删除。
我来说两句