Recibo un error de tiempo de compilación con este código:
const someFunction = async (myArray) => { return myArray.map(myValue => { return { id: "my_id", myValue: await service.getByValue(myValue); } }); };El mensaje de error es:
esperar es una palabra reservada
¿Por qué no puedo usarlo así?
También probé de otra manera, pero me da el mismo error:
const someFunction = async (myArray) => { return myArray.map(myValue => { const myNewValue = await service.getByValue(myValue); return { id: "my_id", myValue: myNewValue } }); };No puede hacer esto como imagina, porque no puede usar await si no está directamente dentro de una función async .
Lo más sensato sería hacer que la función pasada al map sea asíncrona. Esto significa que el map devolvería una serie de promesas. Luego podemos usar Promise.all para obtener el resultado cuando regresen todas las promesas. Como Promise.all devuelve una promesa, la función externa no necesita ser async .
const someFunction = (myArray) => { const promises = myArray.map(async (myValue) => { return { id: "my_id", myValue: await service.getByValue(myValue) } }); return Promise.all(promises); }Si desea ejecutar map con una función de mapeo asíncrono, puede usar el siguiente código:
const resultArray = await Promise.all(inputArray.map(async (i) => someAsyncFunction(i)));Cómo funciona:
inputArray.map(async ...) devuelve una matriz de promesas, una para cada valor en inputArray .Promise.all() alrededor de la matriz de promesas lo convierte en una sola promesa.Promise.all() devuelve una matriz de valores: cada promesa individual se resuelve en un valor.await delante de Promise.all() para esperar a que la promesa combinada se resuelva y almacene la matriz de subpromesas resueltas en la variable resultArray . Al final, obtenemos un valor de salida en resultArray para cada elemento en inputArray , mapeado a través de la función someAsyncFunction . Tenemos que esperar a que se resuelvan todas las funciones asíncronas antes de que el resultado esté disponible.
Esto se debe a que la función en el map no es asíncrona , por lo que no puede esperar en su declaración de devolución. Se compila con esta modificación:
const someFunction = async (myArray) => { return myArray.map(async (myValue) => { // <-- note the `async` on this line return { id: "my_id", myValue: await service.getByValue(myValue) } }); };Entonces… no es posible dar una recomendación sin ver el resto de su aplicación, pero dependiendo de lo que esté tratando de hacer, haga que la función interna sea asíncrona o intente crear una arquitectura diferente para este bloque.
Actualización: es posible que obtengamos una espera de nivel superior algún día: https://github.com/MylesBorins/proposal-top-level-await