在没有async关键字的情况下在全局范围内使用await

时间:2018-07-25 18:09:53

标签: javascript node.js ecmascript-6 es6-promise

我正在尝试在nodejs REPL中的全局范围上执行类似的操作。根据我的理解,以下两个陈述均有效。 see docs

let x = await Promise.resolve(2);
let y = await 2;

但是,这两个语句都抛出错误。

有人可以解释为什么吗? 我的节点版本是v8.9.4

5 个答案:

答案 0 :(得分:4)

您不能这样做。 MDN doc

  

await运算符用于等待Promise。 只能使用   在异步函数中。

答案 1 :(得分:3)

await只能在标有async的函数中使用,因此有两种方法可以实现。

第一种方法是创建一个像这样的自调用函数:

(async function() {
  let x = await Promise.resolve(2)
  let y = await 2
  
  console.log(x, y)
})()

或者第二种方法是使用.then()

Promise.resolve(2).then(async data => {
  let x = data
  let y = await 2

  console.log(x, y)
})

答案 2 :(得分:1)

自节点10起,您可以使用--experimental-repl-await运行节点进程以允许进行级别等待 https://nodejs.org/api/repl.html#repl_await_keyword

答案 3 :(得分:0)

该提案目前处于TC39流程的第二阶段。 LINK

到目前为止,您可以在Google Chrome和Mozilla Firefox中使用此功能。您可以在控制台中使用顶级等待而无需异步。

Top level await in console

https://twitter.com/addyosmani/status/1080365576218759168

答案 4 :(得分:-1)

您可以在异步函数中包装全局范围内的所有代码。

例如:

// ...global imports...

new Promise (async () => {

  // ...all code in the global scope...

}).then()