Можно ли будет отбросить async / await в javascript и сделать async прозрачным? - PullRequest
0 голосов
/ 04 сентября 2018

В последнее время я был худым около async/await, и его случай похож на ссылки. В javascript не существует указателей, операторов разыменования и т. Д., Которые существуют в языках низкого уровня, что делает javascript более простым, потому что он притворяется, что переменная хранит значение для объекта, в то время как на самом деле он хранит ссылку на объект и волшебным образом разрешает его в объект, когда он замечает, что вы действительно хотите получить данные. Таким образом, похоже, что переменная хранит сам объект.

Примерно такую ​​же ситуацию можно наблюдать с обещаниями: когда у вас есть обещание, хранящееся в некоторой переменной, вы фактически не заботитесь о самом обещании - вы заботитесь о его значении.

AFAIK, в javascript нет указателей, потому что они вводили в заблуждение и их можно было абстрагировать. То же самое касается обещаний.

Вместо того, чтобы делать

const data = await fetch("endpoint");

вы могли бы делать

const data = fetch("endpoint");

потому что javascript выяснит, что вам нужны данные, возвращаемые при извлечении. Обещания и async / await на самом деле могут стать внутренней реализацией языка.

  1. Будет ли это возможно (имеется в виду, что это может быть реализовано в javascript)?
  2. Есть ли язык, который уже делает это?
  3. Хотите, чтобы это приземлилось в javasrcipt?

1 Ответ

0 голосов
/ 04 сентября 2018

Маловероятно, что javascript будет поддерживать этот шаблон. Его нынешний подход к асинхронному коду настолько глубок, что повсеместное «явное ожидание» действительно сделает javascript больше не javascript. Я думаю, что было бы возможно придумать язык, который компилируется в javascript.

Если вы ищете язык, который делает , то посмотрите на Go. Это гораздо более разумная модель для асинхронного программирования, потому что она рассматривалась с самого начала. В javascript обещания и async / await были добавлены намного позже.

В 9 случаях из 10 вы захотите «ожидать» асинхронную функцию, поэтому на ходу каждая функция «ожидается». Если вы не хотите «ждать» функцию, вы вызываете функцию следующим образом:

go foo()

Таким образом, сравнивая Go и Javascript, ключевые слова go и await очень похожи, но используются для противоположных случаев.

На ходу ключевое слово async перед функциями также не требуется.

...