Да, await / async был отличной концепцией, но реализация полностью нарушена.
По какой-то причине ключевое слово await было реализовано таким образом, что его можно использовать только в рамках асинхронного метода. На самом деле это ошибка, хотя вы не увидите упоминания о ней нигде, кроме как здесь. Исправление этой ошибки заключалось в реализации ключевого слова await таким образом, чтобы его можно было использовать только ДЛЯ ВЫЗОВА асинхронной функции, независимо от того, является ли вызывающая функция синхронной или асинхронной.
Из-за этой ошибки, если вы используете await для вызова реальной асинхронной функции где-то в вашем коде, то ВСЕ ваши функции должны быть помечены как асинхронные, и ВСЕ ваши вызовы функций должны использовать await.
По сути, это означает, что вы должны добавить накладные расходы, связанные с обещаниями, ко всем функциям во всем приложении, большинство из которых не являются и никогда не будут асинхронными.
Если вы действительно думаете об этом, использование await в функции должно требовать функции, содержащей ключевое слово await, чтобы НЕ БЫТЬ ASYNC - это потому, что ключевое слово await собирается приостановить обработку в функции, в которой найдено ключевое слово await. Если обработка в этой функции приостановлена, то она определенно НЕ асинхронна.
Итак, разработчикам javascript и ECMAScript - исправьте реализацию await / async следующим образом ...
- await может использоваться только для ВЫЗОВА асинхронных функций.
- await может появляться в любой функции, синхронной или асинхронной.
- Измените сообщение об ошибке с «await is valid only in async function» на «await can only be used to call async functions».
awaitможно использовать только внутриasyncфункции. То естьawaitделает функцию асинхронной, поэтому она должна быть объявлена как таковая.