当关键字后面的表达式没有评估为承诺时,`await`会发生什么?

Kar*_*lek 10 javascript async-await ecmascript-next

我有这样的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))
Run Code Online (Sandbox Code Playgroud)

var threeP = await three线应该怎么办?

代码应该按预期继续,还是失败,因为three这不是承诺?

这个repo中,它被称为"Debatable Syntax&Semantics".我无法阅读官方文档以找到确切的定义,因为它太技术性了.

默认的babel.js转换按预期记录5; 然而,nodent- 一个不同的变换 - 打印TypeError: three.then is not a function.哪个是正确的,为什么?

Mat*_*ens 6

根据当前的工作草案规范,运行时应首先将等待的值"转换"为承诺:

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正确实现了规范.

另一方面,nodent 故意不支持默认等待非承诺.wrapAwait如果您希望所有等待的值首先包含在承诺中,那么可以使用一个选项,但nodent文档报告这可能会影响性能.