valid try promises only node done catch await async all javascript typescript promise async-await ecmascript-2017

javascript - try - Utilice async aguarde con Array.map



promise all async await (4)

El problema aquí es que está tratando de await una serie de promesas en lugar de una promesa. Esto no hace lo que esperas.

Cuando el objeto pasado a await no es una Promesa, await simplemente devuelve el valor tal como está inmediatamente en lugar de intentar resolverlo. Entonces, dado que pasó a await una matriz (de objetos Promise) aquí en lugar de una Promesa, el valor devuelto por await es simplemente esa matriz, que es del tipo Promise<number>[] .

Lo que debe hacer aquí es llamar a Promise.all en la matriz devuelta por el map para convertirlo en una sola Promesa antes de await .

De acuerdo con los documentos de MDN para Promise.all :

El Promise.all(iterable) devuelve una promesa que se resuelve cuando se han resuelto todas las promesas del argumento iterable, o rechaza con el motivo de la primera promesa aprobada que rechaza.

Entonces en tu caso:

var arr = [1, 2, 3, 4, 5]; var results: number[] = await Promise.all(arr.map(async (item): Promise<number> => { await callAsynchronousOperation(item); return item + 1; }));

Esto resolverá el error específico que encuentre aquí.

Dado el siguiente código:

var arr = [1,2,3,4,5]; var results: number[] = await arr.map(async (item): Promise<number> => { await callAsynchronousOperation(item); return item + 1; });

que produce el siguiente error:

TS2322: El tipo ''Promesa <número> []'' no se puede asignar al tipo ''número []''. El tipo ''Promesa <número> no se puede asignar al tipo'' número ''.

¿Cómo puedo arreglarlo? ¿Cómo puedo hacer que async await y Array.map trabaje junto?


Hay otra solución para esto si no está utilizando Promises nativas sino Bluebird.

También puede intentar usar Promise.map() , mezclando el array.map y Promise.all

En tu caso:

var arr = [1,2,3,4,5]; var results: number[] = await Promise.map(arr, async (item): Promise<number> => { await callAsynchronousOperation(item); return item + 1; });


Recomiendo usar Promise.all como se mencionó anteriormente, pero si realmente desea evitar ese enfoque, puede hacer un bucle a favor o en cualquier otro:

const arr = [1,2,3,4,5]; let resultingArr = []; for (let i in arr){ await callAsynchronousOperation(i); resultingArr.push(i + 1) }


Si asigna una matriz de Promesas, puede resolverlas todas en una matriz de números. Ver Promesa.todos .