Utilisez async en attente avec Array.map

Vu le code suivant:

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

qui génère l’erreur suivante:

TS2322: Le type ‘Promise []’ n’est pas assignable au type ‘nombre []’. Type ‘Promise n’est pas assignable au type’ numéro ‘.

Comment puis-je le réparer? Comment puis-je faire en sorte Array.map et Array.map fonctionnent ensemble?

Le problème ici est que vous essayez d’ await un tableau. Cela ne fait pas ce que vous attendez.

Lorsque l’object passé à await n’est pas une promesse, await simplement renvoie la valeur as-is au lieu d’essayer de le résoudre. Donc, comme vous avez passé l’ await un tableau (d’objects Promise) au lieu d’une promesse, la valeur renvoyée par wait est simplement ce tableau, qui est de type Promise[] .

Ce que vous devez faire ici est d’appeler Promise.all sur le tableau renvoyé par map afin de le convertir en une seule promesse avant de l’ await .

Selon les documents MDN pour Promise.all :

La Promise.all(iterable) renvoie une promesse qui se résout lorsque toutes les promesses de l’argument itérable ont été résolues ou rejette la raison de la première promesse rejetée.

Donc dans votre cas:

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

Cela résoudra l’erreur spécifique que vous rencontrez ici.

Il existe une autre solution si vous n’utilisez pas les promesses natives, mais Bluebird.

Vous pouvez également essayer d’utiliser Promise.map () , en mélangeant le array.map et Promise.all

Dans votre cas:

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

Si vous associez à un tableau de promesses, vous pouvez ensuite les résoudre toutes dans un tableau de nombres. Voir Promise.all .

Je recommande d’utiliser Promise.all comme mentionné ci-dessus, mais si vous avez vraiment envie d’éviter cette approche, vous pouvez faire une boucle pour ou pour toute autre:

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