0

Ключевое слово 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?

  • Нельзя. Никак нельзя. Вообще нельзя. – Alexey Ten Jun 29 '21 at 07:02
  • @AlexeyTen не дубликат. Я знаю как возвращать значения. Я знаю теорию. Тут другое. – Anton S. Jun 29 '21 at 07:12
  • @AlexeyTen получается только лепить всякие неудобные фигни типа then? вся удобочитаемость кода в итоге пропадает(( получается можно только писать if (await userHasPermission()) { ... } или userHasPermission().then(...) ? – Anton S. Jun 29 '21 at 07:13
  • Для удобочитаемости придумали async/await, но то всё равно асинхронные промизв под капотом и с этим ничего сделать нельзя – Alexey Ten Jun 29 '21 at 07:18
  • а чем if (await userHasPermission()) неудобно? Наоборот, очень удобно и наглядно! – Stepan Kasyanenko Jun 29 '21 at 08:31
  • @StepanKasyanenko в целом-то да) (на самом деле я только при написании комментарии об этом вспомнил))). Просто у меня договорённость в команде что мы с запроса всегда возвращаем json и поэтому у меня скорее получится вот так: if (await userHasPermission().hasPermission), т.е. другой метод будет знать о том, что должны вернуть в предыдущем методе. Можно ли как-то этот момент вырулить?)) – Anton S. Jun 29 '21 at 10:35
  • можете вернуть hasPermission из функции userHasPermission. У вас кстати в вопросе в коде так и написано :) – Stepan Kasyanenko Jun 29 '21 at 11:15
  • @StepanKasyanenko но ведь функция возвращает промис)) попробую уточнить, то есть можно писать return result и if (await userHasPermission().hasPermission) а можно return result.hasPermission; и if (await userHasPermission()) ? если второе возможно, тогда уже становится круто) – Anton S. Jun 29 '21 at 15:44
  • @StepanKasyanenko что-то такое получится как я понимаю https://i.stack.imgur.com/xj0Ut.png - два async и три await)) как-то криповенько, но думаю это норма)) – Anton S. Jun 29 '21 at 18:43
  • await userHasPermission().hasPermission !== (await userHasPermission()).hasPermission – entithat Jun 30 '21 at 12:48

1 Answers1

3

Вот так можно использовать - красиво и наглядно. Возвращать из 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();