Usa async attendi con Array.map

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) }