Node.js 7.5上的“等待意外的标识符”

我正在尝试Node.js中的await关键字。 我有这个testing脚本:

 "use strict"; function x() { return new Promise(function(resolve, reject) { setTimeout(function() { resolve({a:42}); },100); }); } await x(); 

但是,当我在节点运行它,我得到

 await x(); ^ SyntaxError: Unexpected identifier 

无论我是用node还是node --harmony-async-await运行它,还是在Node.js 7.5或Node.js 8(夜间编译)的Mac上的Node.js'repl'中运行它。

奇怪的是,相同的代码在Runkit JavaScript笔记本环境中工作: https ://runkit.com/glynnbird/58a2eb23aad2bb0014ea614b

我究竟做错了什么?

感谢其他评论者和一些其他的研究await只能用于asyncfunction,例如

 async function x() { var obj = await new Promise(function(resolve, reject) { setTimeout(function() { resolve({a:42}); },100); }); return obj; } 

然后我可以使用这个函数作为承诺,例如

 x().then(console.log) 

或者在另一个asynchronousfunction。

令人困惑的是,Node.js repl不允许你这样做

 await x(); 

像RunKit笔记本电脑一样。

正如其他人所说,你不能在asynchronous函数之外调用“等待”。 但是,要解决这个问题,你可以包装await x(); 在一个asynchronous函数调用。 也就是说,

 function x() { return new Promise(function(resolve, reject) { setTimeout(function() { resolve({a:42}); },100); }); } //Shorter Version of x(): var x = () => new Promise((res,rej)=>setTimeout(() => res({a:42}),100)); (async ()=>{ try{ var result = await x(); console.log(result); }catch(e){ console.log(e) } })(); 

这应该在节点7.5或更高版本中工作。 也在铬金丝雀片段区域工作。

所以正如别人所build议的等待将asynchronous工作。 所以你可以使用下面的代码来避免使用:

 async function callX() { var x_value = await x() console.log(x) } callX()