Le problème ici est que vous essayez de await
un tableau de promesses plutôt qu'une promesse. Cela ne fait pas ce que vous attendez.
Lorsque l'objet passé à await
n'est pas une promesse, await
renvoie simplement la valeur telle quelle immédiatement au lieu d'essayer de la résoudre. Donc, puisque vous avez passé await
un tableau (d'objets Promise) ici au lieu d'une Promise, la valeur renvoyée par await est simplement ce tableau, qui est de type Promise<number>[]
.
Ce que vous devez faire ici, c'est appeler Promise.all
sur le tableau retourné par map
afin de le convertir en une seule Promesse avant que await
l'ingérer.
Selon le Documents MDN pour Promise.all
:
Le site Promise.all(iterable)
renvoie une promesse qui résout lorsque toutes les promesses de l'argument itérable ont été résolues, ou bien rejette avec la raison de la première promesse passée qui rejette.
Donc dans votre cas :
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;
}));
Cela permettra de résoudre l'erreur spécifique que vous rencontrez ici.
6 votes
Pourquoi essayez-vous de transformer une opération synchrone en une opération asynchrone ?
arr.map()
est synchrone et ne renvoie pas de promesse.2 votes
Vous ne pouvez pas envoyer une opération asynchrone à une fonction, comme
map
qui s'attend à ce qu'il soit synchrone, et s'attendre à ce que cela fonctionne.2 votes
@jfriend00 J'ai plusieurs instructions await dans la fonction interne. C'est en fait une longue fonction et je l'ai juste simplifiée pour la rendre lisible. J'ai ajouté maintenant un appel await pour rendre plus claire la raison pour laquelle elle doit être asynchrone.
1 votes
Vous devez attendre quelque chose qui renvoie une promesse, pas quelque chose qui renvoie un tableau.
0 votes
Async/await ne fait pas partie de ES7.
5 votes
Une chose utile à savoir est que chaque fois que vous marquez une fonction comme étant
async
vous faites en sorte que cette fonction renvoie une promesse. Donc, bien sûr, une carte d'async renvoie un tableau de promesses :)