Что должно произойти с `await`, когда выражение после ключевого слова не оценивается как обещание?

У меня есть такой код ES7.

async function returnsfive() {
  var three = 3;
  var threeP = await three;
  return threeP+2;
}

returnsfive().then(k=>console.log(k), e=>console.error("err", e))

Что должно произойти на строке var threeP = await three?

Должен ли код продолжаться, как ожидалось, или не работать, потому что three не является обещанием?

В этом репозитории он упоминается как "Спорный синтаксис и семантика". Я не могу прочитать официальную документацию, чтобы найти точное определение, так как оно слишком техническое.

Журналы преобразования babel.js по умолчанию 5, как и ожидалось; однако nodent — другое преобразование — печатает TypeError: three.then is not a function. Что правильно и почему?


person Karel Bílek    schedule 10.08.2016    source источник
comment
async/await не является частью ES7. Это предложение.   -  person Felix Kling    schedule 12.08.2016
comment
Ой. Спасибо за редактирование тегов!   -  person Karel Bílek    schedule 16.08.2016


Ответы (1)


Согласно текущей рабочей спецификации, среда выполнения должна "преобразовать" сначала ожидаемое значение обещания:

AsyncFunctionAwait ( value )

  1. Пусть asyncContext будет текущим контекстом выполнения.
  2. Пусть promiseCapability будет ! NewPromiseCapability(%Promise%).
  3. Пусть resolveResult будет ! Call(promiseCapability.[[Resolve]], undefined, value).
  4. ...

Комбинация шагов 2 и 3 примерно эквивалентна вызову Promise.resolve(value), который создает новое обещание, которое разрешается с заданным значением или, если значение является тогда, будет следовать за этим значением.

Другими словами: await 3 эквивалентно await Promise.resolve(3), и Babel правильно реализует спецификацию.

node, с другой стороны, преднамеренно не поддерживает ожидание не обещания по умолчанию. Доступна опция wrapAwait, если вы хотите, чтобы все ожидаемые значения были сначала заключены в промис, но документация узла сообщает, что это может повлиять на производительность.

person Mattias Buelens    schedule 10.08.2016