Как вернуть bool/string/other если внутри происходит работа с await?

Ключевое слово async перед функцией гарантирует, что эта функция в любом случае вернёт промис.

Что делать если необходимо сделать функцию которая что-то чекает, должна вернуть не промис, но она опирается на результат работы аякс запроса или нескольких? Нужно, чтобы функция возвращала например void или bool/string/object или любой другой результат, но при этом внутри себя содержала await?

Как пример (не смотрите на проверку прав пользователя, это просто пример, можно подставить что угодно):

let userHasPermission = () => {
    let result = // await тут обращение к серверу в ожидании проверки
    
    return result.hasPermission;
};

let showButtons = () => {
    if (userHasPermission())
        btn.show();
}

showButtons();

Писать userHasPermission().then(() => { btn.show(); } ) ?

Можно ли как-то без then? Чтобы было наглядное if (что-то), и возврат не промис в функции с await?


Ответы (1 шт):

Автор решения: Stepan Kasyanenko

Вот так можно использовать - красиво и наглядно. Возвращать из userHasPermission сразу hasPermission.

//emulating AJAX request
let getUser = async() => {
  return new Promise(resolve => setTimeout(() => resolve({
    hasPermission: true
  }), 3000));
}

let userHasPermission = async() => {
  let result = await getUser();
  return result.hasPermission;
};

let showButtons = async() => {
  if (await userHasPermission())
    console.log('btn show');
}

console.log('will show "btn show" after 3 seconds');
showButtons();

→ Ссылка