在 Node.js 7.5上等待意外标识符

我正在尝试使用 Node.js 中的 await关键字:

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

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

await x();
^
SyntaxError: Unexpected identifier

无论我是用 nodenode --harmony-async-await运行它,还是用 Node.js 7.5或 Node.js 8(每晚构建)在 Mac 上的 Node.js‘ repl 中运行它。

奇怪的是,在 Runkit JavaScript 笔记本环境 https://runkit.com/glynnbird/58a2eb23aad2bb0014ea614b中也可以使用同样的代码

我做错了什么?

77817 次浏览

由于其他评论和一些其他研究 await只能用于 async的功能,例如。

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

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

x().then(console.log)

或者在另一个异步函数中。

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

await x();

就像 RunKit 笔记本环境所做的那样。

正如其他人所说,您不能在异步函数之外调用“ wait”。 但是,为了解决这个问题,您可以在一个异步函数调用中包装 wait x () ; ,

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或以上。也可以在铬金丝雀片段区域。

所以按照其他人的建议等待将在异步内工作。所以你可以使用下面的代码来避免使用:

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


callX();