Dato il seguente codice:
var arr = [1,2,3,4,5]; var results: number[] = await arr.map(async (item): Promise => { await callAsynchronousOperation(item); return item + 1; });
che produce il seguente errore:
TS2322: digitare ‘Promise []’ non è assegnabile al tipo ‘numero []’. Digitare ‘Promise non è assegnabile al tipo’ numero ‘.
Come posso ripararlo? Come posso async await
e Array.map
funziona insieme?
Il problema qui è che stai cercando di await
un array. Questo non fa quello che ti aspetti.
Quando l’object passato ad await
non è una Promessa, await
semplicemente restituisce immediatamente il valore as-is invece di provare a risolverlo. Quindi, dato che sei passato ad await
una matrice (di oggetti Promessa) qui invece di una Promessa, il valore restituito dall’attesa è semplicemente quella matrice, che è di tipo Promise
.
Quello che devi fare qui è chiamare Promise.all
sull’array restituito dalla map
per convertirlo in una singola Promessa prima di await
.
Secondo i documenti MDN per Promise.all
:
Il
Promise.all(iterable)
restituisce una promise che si risolve quando tutte le promesse nell’argomento iterabile sono state risolte, o rifiuta con il motivo della prima promise passata che rifiuta.
Quindi nel tuo caso:
var arr = [1, 2, 3, 4, 5]; var results: number[] = await Promise.all(arr.map(async (item): Promise => { await callAsynchronousOperation(item); return item + 1; }));
Questo risolverà l’errore specifico che stai incontrando qui.
C’è un’altra soluzione per questo se non si utilizzano Promesse native ma Bluebird.
Puoi anche provare a utilizzare Promise.map () , mescolando array.map e Promise.all
Nel tuo caso:
var arr = [1,2,3,4,5]; var results: number[] = await Promise.map(arr, async (item): Promise => { await callAsynchronousOperation(item); return item + 1; });
Se esegui il mapping a un array di Promises, puoi risolverli tutti in una serie di numeri. Vedi Promise.all .
Ti consiglio di utilizzare Promise.all come accennato in precedenza, ma se hai davvero voglia di evitare questo approccio, puoi fare un ciclo for o qualsiasi altro:
const arr = [1,2,3,4,5]; let resultingArr = []; for (let i in arr){ await callAsynchronousOperation(i); resultingArr.push(i + 1) }