Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当关键字后面的表达式的计算结果不符合承诺时,“await”会发生什么情况?_Javascript_Async Await_Ecmascript Next - Fatal编程技术网

Javascript 当关键字后面的表达式的计算结果不符合承诺时,“await”会发生什么情况?

Javascript 当关键字后面的表达式的计算结果不符合承诺时,“await”会发生什么情况?,javascript,async-await,ecmascript-next,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)) 在var threeP=await three行应该发生什么 代码是否应按预期继续,或者失败,因为three不是承诺 在中,它被称为“有

我有这样的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不是一个函数
。哪个是正确的,为什么是正确的?

根据,运行时应首先将等待的值“转换”为承诺:

异步函数等待(值)

  • asyncContext
    作为正在运行的执行上下文
  • 承诺成为
    !新承诺能力(%Promise%)
  • 解析结果
    成为
    !调用(promiseCapability.[Resolve]],未定义,值)
  • 第2步和第3步的组合大致相当于调用,这将创建一个新的承诺,该承诺将使用给定的值进行解析,或者-如果该值是一个thenable-将跟随该thenable

    换句话说:
    wait 3
    相当于
    wait Promise.resolve(3)
    ,巴贝尔正确地实现了规范


    另一方面是点头。如果您希望首先将所有等待的值包装在承诺中,则有一个
    wrapAwait
    选项可用,但nodent文档报告这可能会影响性能。

    async/await
    不是ES7的一部分。这是一个提议。谢谢你编辑标签!