11

我有一个这样的 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不是承诺?

这个 repo中,它被称为“有争议的语法和语义”。我无法通读官方文档以找到确切的定义,因为它太技术性了。

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

4

1 回答 1

8

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

AsyncFunctionAwait ()

  1. asyncContext成为正在运行的执行上下文。
  2. 让。promiseCapability_! NewPromiseCapability(%Promise%)
  3. 让。resolveResult_! Call(promiseCapability.[[Resolve]], undefined, value)
  4. ...

第 2 步和第 3 步结合起来大致相当于调用Promise.resolve(value),它创建了一个新的 Promise,该 Promise 使用给定的值解析,或者 - 如果该值是 thenable - 将遵循该 thenable。

换句话说:await 3等同于await Promise.resolve(3),并且 Babel 正确地实现了规范。

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

于 2016-08-10T22:45:46.347 回答