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 .