Как получить результат от асинхронной функции в синхронной функции в typescript?

#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) ...
}