Estoy experimentando con la palabra clave await en Node.js. Tengo este script de prueba:
"use strict"; function x() { return new Promise(function(resolve, reject) { setTimeout(function() { resolve({a:42}); },100); }); } await x();Pero cuando lo ejecuto en el nodo obtengo
await x(); ^ SyntaxError: Unexpected identifier ya sea que lo ejecute con node o node --harmony-async-await o en Node.js 'repl' en mi Mac con Node.js 7.5 o Node.js 8 (construcción nocturna).
Curiosamente, el mismo código funciona en el entorno de cuaderno Runkit JavaScript: https://runkit.com/glynnbird/58a2eb23aad2bb0014ea614b
¿Qué estoy haciendo mal?
Gracias a los otros comentaristas y algunas otras investigaciones en await solo se pueden usar en una función async , por ejemplo
async function x() { var obj = await new Promise(function(resolve, reject) { setTimeout(function() { resolve({a:42}); },100); }); return obj; }Entonces podría usar esta función como una Promesa, por ejemplo
x().then(console.log)o en otra función asíncrona.
De manera confusa, la respuesta de Node.js no le permite hacer
await x();donde como lo hace el entorno del portátil RunKit.
Como han dicho otros, no puede llamar a 'esperar' fuera de una función asíncrona. Sin embargo, para evitar esto, puede envolver await x(); en una llamada de función asíncrona. Es decir,
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) } })();Esto debería funcionar en Node 7.5 o superior. También funciona en el área de fragmentos canarios de cromo.
por lo que, según lo sugerido por otros, await funcionará dentro de async. Entonces puede usar el siguiente código para evitar usar entonces:
async function callX() { let x_value = await x(); console.log(x_value); } callX();