Escribí este código en lib/helper.js
var myfunction = async function(x,y) {
....
reutrn [variableA, variableB]
}
exports.myfunction = myfunction;
y luego intenté 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
"await solo es válido en función asincrónica"
¿Cual es el problema?
javascript
node.js
j.doe
fuente
fuente

awaitsolo se puede usar dentro de unaasyncfunción. Es decir,awaithace que una función sea asíncrona, por lo que debe declararse como tal.Respuestas:
El error no se refiere a
myfunctionsino astart.Yo uso la oportunidad de esta pregunta para aconsejarle sobre un patrón conocido de lucha contra el uso de
awaitlo que es:return await.INCORRECTO
CORRECTO
Además, sepa que hay un caso especial donde
return awaites correcto e importante: (usando try / catch)¿Hay problemas de rendimiento con el "retorno en espera"?
fuente
startcomo unaasyncfunción (aunque algunos optarán por hacerlo de todos modos, para ser más explícitos)Cuando recibí este error, resultó que tenía una llamada a la función de mapa dentro de mi función "asíncrona", por lo que este mensaje de error en realidad se refería a que la función de mapa no estaba marcada como "asíncrona". Solucioné este problema eliminando la llamada "await" de la función del mapa y encontrando alguna otra forma de obtener el comportamiento esperado.
fuente
someArray.map(async (someVariable) => { return await someFunction(someVariable)})awaiten su código es engañoso, porqueArray.mapno manejará la función como una función asincrónica. Para que quede perfectamente claro, una vez finalizada lamapfunción,someFunctiontodo estará pendiente. Si realmente quieres esperar a que terminen las funciones tienes que escribir:await Promise.all(someArray.map(someVariable => someFunction(someVariable)))oawait Promise.all(someArray.map(someFunction))).Para usar
await, su contexto de ejecución debe estarasyncen la naturalezaComo se dijo, debe definir la naturaleza de su
executing contextlugar en el que está dispuesto a realizarawaituna tarea antes que nada.Simplemente coloque
asyncantes de lafndeclaración en la queasyncse ejecutará su tarea.Explicación:
En su pregunta, está importando un archivo
methodque estáasynchronousen la naturaleza y se ejecutará en paralelo. Pero donde está intentando ejecutar eseasyncmétodo es dentro de un diferenteexecution contextque debe definirasyncpara usarawait.Preguntándome qué pasa bajo el capó
awaitconsume métodos / funciones de promesa / futuro / devolución de tareas yasyncmarca un método / función como capaz de usar await.Además, si está familiarizado
promises, enawaitrealidad está haciendo el mismo proceso de promesa / resolución. Crea una cadena de promesas y ejecuta su próxima tarea en laresolvedevolución de llamada.Para obtener más información, puede consultar MDN DOCS .
fuente
La implementación actual de
async/awaitsolo admite laawaitpalabra clave dentro de lasasyncfunciones. Cambie lastartfirma de su función para que pueda usarlaawaitdentrostart.Para los interesados, la propuesta de nivel superior se
awaitencuentra actualmente en la Etapa 2: https://github.com/tc39/proposal-top-level-awaitfuente
async, ese es el objetivo deasync.--experimental-repl-awaitopción.Tuve el mismo problema y el siguiente bloque de código estaba dando el mismo mensaje de error:
El problema es que el método getCommits () era asíncrono pero le estaba pasando el repositorio de argumentos que también fue producido por Promise. Entonces, tuve que agregar la palabra async así: async (repo) y comenzó a funcionar:
fuente
async / await es el mecanismo de manejo de la promesa, dos formas en que podemos hacerlo
o podemos usar await para esperar a que la promesa se complete por completo primero, lo que significa que se rechaza o se resuelve.
Ahora, si queremos usar await (esperando que se cumpla una promesa) dentro de una función, es obligatorio que la función contenedora sea una función asíncrona porque estamos esperando que una promesa se cumpla de forma asincrónica || tiene sentido ¿verdad ?.
fuente
"await solo es válido en función asincrónica"
¿Pero por qué? 'await' convierte explícitamente una llamada asíncrona en una llamada síncrona y, por lo tanto, la persona que llama no puede ser asíncrona (o asincable), al menos, no porque la llamada se realice en 'espera'.
fuente
Sí, await / async fue un gran concepto, pero la implementación está completamente rota.
Por alguna razón, la palabra clave await se ha implementado de tal manera que solo se puede usar dentro de un método asincrónico. De hecho, esto es un error, aunque no verá que se mencione como tal en ningún otro lugar que no sea aquí. La solución para este error sería implementar la palabra clave await de manera que solo se pueda usar PARA LLAMAR a una función asíncrona, independientemente de si la función de llamada es en sí misma síncrona o asíncrona.
Debido a este error, si usa await para llamar a una función asíncrona real en algún lugar de su código, TODAS sus funciones deben estar marcadas como asíncronas y TODAS sus llamadas a funciones deben usar await.
Básicamente, esto significa que debe agregar la sobrecarga de las promesas a todas las funciones en toda su aplicación, la mayoría de las cuales no son y nunca serán asincrónicas.
Si realmente lo piensa, el uso de await en una función debería requerir que la función que contiene la palabra clave await NO SEA ASINC. Esto se debe a que la palabra clave await pausará el procesamiento en la función donde se encuentra la palabra clave await. Si el procesamiento en esa función está en pausa, definitivamente NO es asíncrono.
Entonces, para los desarrolladores de javascript y ECMAScript, corrijan la implementación de await / async de la siguiente manera ...
fuente
asynceso refleja el hecho de que muchas de sus funciones requieren los resultados de procesos externos. Eso es completamente canónico en mi opinión.awaitpara que solo se pueda usar con llamadas a funciones: para un solo proceso externo, solo un solo punto en el código javascript puede ser notificado cuando ese proceso se completa. Por ejemplo, si el contenido de un archivo es necesario para 3 propósitos independientes, cada propósito debería hacerlo de forma independientelet content = await readTheFile();; esto se debe a que no se puede esperar la "promesa del contenido del archivo", solo "el acto de leer el archivo y reanudar una vez que se ha leer".