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
await
solo se puede usar dentro de unaasync
función. Es decir,await
hace que una función sea asíncrona, por lo que debe declararse como tal.Respuestas:
El error no se refiere a
myfunction
sino astart
.Yo uso la oportunidad de esta pregunta para aconsejarle sobre un patrón conocido de lucha contra el uso de
await
lo que es:return await
.INCORRECTO
CORRECTO
Además, sepa que hay un caso especial donde
return await
es correcto e importante: (usando try / catch)¿Hay problemas de rendimiento con el "retorno en espera"?
fuente
start
como unaasync
funció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)})
await
en su código es engañoso, porqueArray.map
no manejará la función como una función asincrónica. Para que quede perfectamente claro, una vez finalizada lamap
función,someFunction
todo 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 estarasync
en la naturalezaComo se dijo, debe definir la naturaleza de su
executing context
lugar en el que está dispuesto a realizarawait
una tarea antes que nada.Simplemente coloque
async
antes de lafn
declaración en la queasync
se ejecutará su tarea.Explicación:
En su pregunta, está importando un archivo
method
que estáasynchronous
en la naturaleza y se ejecutará en paralelo. Pero donde está intentando ejecutar eseasync
método es dentro de un diferenteexecution context
que debe definirasync
para usarawait
.Preguntándome qué pasa bajo el capó
await
consume métodos / funciones de promesa / futuro / devolución de tareas yasync
marca un método / función como capaz de usar await.Además, si está familiarizado
promises
, enawait
realidad está haciendo el mismo proceso de promesa / resolución. Crea una cadena de promesas y ejecuta su próxima tarea en laresolve
devolución de llamada.Para obtener más información, puede consultar MDN DOCS .
fuente
La implementación actual de
async
/await
solo admite laawait
palabra clave dentro de lasasync
funciones. Cambie lastart
firma de su función para que pueda usarlaawait
dentrostart
.Para los interesados, la propuesta de nivel superior se
await
encuentra actualmente en la Etapa 2: https://github.com/tc39/proposal-top-level-awaitfuente
async
, ese es el objetivo deasync
.--experimental-repl-await
opció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
async
eso refleja el hecho de que muchas de sus funciones requieren los resultados de procesos externos. Eso es completamente canónico en mi opinión.await
para 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".