Escribí este código en lib/helper.js
var myfunction = async function(x,y) { .... return [variableA, variableB] } exports.myfunction = myfunction;y luego traté de usarlo en otro archivo
var helper = require('./helper.js'); var start = function(a,b){ .... const result = await helper.myfunction('test','test'); } exports.start = start;tengo un error
"esperar solo es válido en la función asíncrona"
¿Cual es el problema?
El error no se refiere a myfunction sino a start .
async function start() { .... const result = await helper.myfunction('test', 'test'); } // My function const myfunction = async function(x, y) { return [ x, y, ]; } // Start function const start = async function(a, b) { const result = await myfunction('test', 'test'); console.log(result); } // Call start start(); Aprovecho la oportunidad de esta pregunta para informarle sobre un patrón anti conocido que usa await , que es: return await .
INCORRECTO
async function myfunction() { console.log('Inside of myfunction'); } // Here we wait for the myfunction to finish // and then returns a promise that'll be waited for aswell // It's useless to wait the myfunction to finish before to return // we can simply returns a promise that will be resolved later // useless async here async function start() { // useless await here return await myfunction(); } // Call start (async() => { console.log('before start'); await start(); console.log('after start'); })();CORRECTO
async function myfunction() { console.log('Inside of myfunction'); } // Here we wait for the myfunction to finish // and then returns a promise that'll be waited for aswell // It's useless to wait the myfunction to finish before to return // we can simply returns a promise that will be resolved later // Also point that we don't use async keyword on the function because // we can simply returns the promise returned by myfunction function start() { return myfunction(); } // Call start (async() => { console.log('before start'); await start(); console.log('after start'); })(); Además, sepa que hay un caso especial en el que la return await es correcta e importante: (usando try/catch)
Para usar await , su contexto de ejecución debe ser de naturaleza async
Como dijo, debe definir la naturaleza de su executing context en el que está dispuesto a await una tarea antes que nada.
Simplemente coloque async antes de la declaración fn en la que se ejecutará su tarea async .
var start = async function(a, b) { // Your async task will execute with await await foo() console.log('I will execute after foo get either resolved/rejected') }Explicación:
En su pregunta, está importando un method que es de naturaleza asynchronous y se ejecutará en paralelo. Pero donde intenta ejecutar ese método async es dentro de un execution context diferente que necesita definir async para usar await .
var helper = require('./helper.js'); var start = async function(a,b){ .... const result = await helper.myfunction('test','test'); } exports.start = start;Preguntándose qué está pasando debajo del capó
await consume métodos/funciones de promesa/futuro/devolución de tareas y async marca un método/función como capaz de usar await.
Además, si está familiarizado con las promises , await en realidad está haciendo el mismo proceso de promesa/resolución. Crea una cadena de promesa y ejecuta su próxima tarea en la devolución de llamada de resolve .
Para obtener más información, puede consultar MDN DOCS .
Cuando recibí este error, resultó que tenía una llamada a la función de mapa dentro de mi función "asincrónica", por lo que este mensaje de error en realidad se refería a que la función de mapa no estaba marcada como "asincrónica". Solucioné este problema sacando la llamada "esperar" de la función de mapa y buscando otra forma de obtener el comportamiento esperado.
var myfunction = async function(x,y) { .... someArray.map(someVariable => { // <- This was the function giving the error return await someFunction(someVariable); }); }