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);
}
你有两个地方做错了
fetchData
是一个 async
函数,但您通常在 searchSessionData
中调用它
.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
函数。
当我 运行 以下 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);
}
你有两个地方做错了
中调用它fetchData
是一个async
函数,但您通常在searchSessionData
.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
函数。