'await Unexpected identifier' on Node.js 7.5
Javascriptnode.jsAsynchronousJavascript Problem Overview
I am experimenting with the await
keyword in Node.js. I have this test script:
"use strict";
function x() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve({a:42});
},100);
});
}
await x();
But when I run it in node I get
await x();
^
SyntaxError: Unexpected identifier
whether I run it with node
or node --harmony-async-await
or in the Node.js 'repl' on my Mac with Node.js 7.5 or Node.js 8 (nightly build).
Oddly, the same code works in the Runkit JavaScript notebook environment: https://runkit.com/glynnbird/58a2eb23aad2bb0014ea614b
What am I doing wrong?
Javascript Solutions
Solution 1 - Javascript
Thanks to the other commenters and some other research await
can only be used in an async
function e.g.
async function x() {
var obj = await new Promise(function(resolve, reject) {
setTimeout(function() {
resolve({a:42});
},100);
});
return obj;
}
I could then use this function as a Promise e.g.
x().then(console.log)
or in another async function.
Confusingly, the Node.js repl doesn't allow you to do
await x();
where as the RunKit notebook environment does.
Solution 2 - Javascript
As others have said, you can't call 'await' outside of an async function. However, to get around this you can wrap the await x(); in an async function call. I.e.,
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)
}
})();
This should work in Node 7.5 or above. Also works in chrome canary snippets area.
Solution 3 - Javascript
so as suggested by others await will work inside async. So you can use the below code to avoid using then:
async function callX() {
let x_value = await x();
console.log(x_value);
}
callX();