#reactjs #typescript #rest #asynchronous #synchronization
#reactjs #typescript #остальное #асинхронный #синхронизация
Вопрос:
Предыстория: мне нужно использовать результат от асинхронной функции getHolidaysByYear
в функции синхронизации isHoliday
, поскольку функция синхронизации является частью компонента. Но асинхронная функция запускается позже, чем функция синхронизации, как получить результат от асинхронной функции перед продолжением функции синхронизации.
Пример:
//Call rest to get range of holidays
async function getHolidaysByYear(year : number) : Date[] {
//I use other rest server to get range
let dates = await api.request(year);
if(dates !== undefined)
{
console.log("holidays : " dates.length);
return dates;
}
else
{
return [];
}
}
//Function is used in component
function isHoliday(current : Moment) : booleant {
//other parts (cache and other parts)
let year : number = current.toDate().getFullYear();
let dates : Date[] = [];
console.log("before : " dates.length);
getHolidaysByYear(year).then(values => {dates = values});
console.log("after : " dates.length);
//other parts (cache and other parts) ...
}
Теперь я получаю следующий результат консоли:
before : 0
after : 0
holidays : 143
Но я хочу получить что-то вроде этого:
before : 0
holidays : 143
after : 143
Ответ №1:
Вы должны поместить часть «после» внутри блока «затем», чтобы убедиться, что часть «после» будет выполнена после getHolidaysByYear
.
getHolidaysByYear(year)
.then(values => {
dates = values
console.log("after: ", dates.length)
// other parts
});
но если вам не нравится помещать все остальное в блок then, вы можете превратить функцию isHoliday в асинхронную функцию.
//Function is used in component
async function isHoliday(current : Moment) : boolean {
//other parts (cache and other parts)
let year : number = current.toDate().getFullYear();
let dates : Date[] = [];
console.log("before : " dates.length);
dates = await getHolidaysByYear(year)
console.log("after : " dates.length);
//other parts (cache and other parts) ...
}