Почему функции javascript должны иметь ключевое слово async? Разве ключевого слова await недостаточно?

Например, почему приведенная ниже функция должна иметь «асинхронность»... не использует ожидание достаточно специфично, чтобы компилятор мог анализировать код без двусмысленности?

# Why do we need async here
async function foo() {
  var user = await getUser(user_id);
  console.log(user);
}

Это из соображений обратной совместимости? (Я не могу придумать код, который использует клавиатуру ожидания в стандартном Javascript..)?

Это в основном для ясности, чтобы было ясно, что эта функция использует новое ключевое слово async? Спасибо


person phzb0x    schedule 26.02.2016    source источник
comment
Я могу только представить, что это облегчает разбор....   -  person Felix Kling    schedule 26.02.2016
comment
В этом примере это не имело бы особого смысла. Вы запускаете что-то асинхронно, а затем говорите дождаться результатов от getUser. Это может иметь больше смысла в контексте более крупной функции.   -  person Neil    schedule 26.02.2016
comment
Вам может быть полезен этот блог: twilio.com /blog/2015/10/ Я согласен, что это, вероятно, проблема синтаксического анализа. Из блога: когда функция объявлена ​​как асинхронная, она может передать выполнение вызывающему коду, ожидая разрешения обещания.   -  person scrappedcola    schedule 26.02.2016
comment
Я предполагаю, что причина сводится к потому что так сказано в спецификации, или, по крайней мере, вероятно, будет, когда есть спецификация, и это шаблон, обычно используемый в других языках, реализующих async/await.   -  person adeneo    schedule 26.02.2016
comment
Как и генераторы функций, зачем им *?   -  person Juan Mendes    schedule 26.02.2016
comment
Дело в том, что для того, чтобы знать наверняка, вам нужно поговорить с человеком, которому вы предложили эту функцию. Это не очень хорошо подходит для переполнения стека, даже если это интересный вопрос сам по себе.   -  person Felix Kling    schedule 26.02.2016
comment
Почему кто-то глупый всегда закрывает чужие вопросы, даже если это хорошие вопросы?   -  person LCB    schedule 05.05.2017


Ответы (1)


С точки зрения языка, ключевые слова async/await в JavaScript разработаны очень близко к тому, как они работают в C#.

У меня есть старая запись в блоге, в которой описываются некоторые дискуссии о том, почему async был явно добавлен в C#: см. Inferring "async" здесь. Короче говоря, добавление ключевых слов является потенциально критическим изменением языка; представьте себе существующее приложение, которое использует var await = false; или что-то в этом роде.

Или, например, как это может быть более двусмысленно, var await = function() {};, которое будет использоваться как await (x);. Глядя на использование await (x);, компилятору было бы трудно решить, что это за выражение. Вы можете возразить, что await — это ключевое слово, если только в области видимости нет переменной с таким именем, но это становится очень странным.

Гораздо более чистое решение — ввести пару ключевых слов, поэтому async (которое используется только для функций и лямбда-выражений и не является двусмысленным) включает ключевое слово await, но только в пределах этой области. Аналогичные преимущества дает наличие function* для обозначения генераторов, а не просто наличие yield.

Это не только менее двусмысленно (поддерживается обратная совместимость с кодом, который использует await для других целей), но и проще для программного обеспечения, и для человека.

person Stephen Cleary    schedule 26.02.2016