Je reçois une erreur de compilation avec ce code:
const someFunction = async (myArray) => {
return myArray.map(myValue => {
return {
id: "my_id",
myValue: await service.getByValue(myValue);
}
});
};
Le message d'erreur est:
attendre est un mot réservé
Pourquoi je ne peux pas l'utiliser comme ça?
J'ai aussi essayé d'une autre manière, mais cela me donne la même erreur:
const someFunction = async (myArray) => {
return myArray.map(myValue => {
const myNewValue = await service.getByValue(myValue);
return {
id: "my_id",
myValue: myNewValue
}
});
};
Vous ne pouvez pas faire cela comme vous l'imaginez, car vous ne pouvez pas utiliser await
si ce n'est pas directement dans une fonction async
.
La chose judicieuse à faire ici serait de rendre la fonction passée à map
de manière asynchrone. Cela signifie que map
renverrait un tableau de promesses. On peut alors utiliser Promise.all
pour obtenir le résultat lorsque toutes les promesses sont revenues. Comme Promise.all
lui-même renvoie une promesse, la fonction externe n'a pas besoin d'être async
.
const someFunction = (myArray) => {
const promises = myArray.map(async (myValue) => {
return {
id: "my_id",
myValue: await service.getByValue(myValue)
}
});
return Promise.all(promises);
}
C'est parce que la fonction dans map
n'est pas asynchrone , vous ne pouvez donc pas avoir attendre dans sa déclaration de retour. Il compile avec cette modification:
const someFunction = async (myArray) => {
return myArray.map(async (myValue) => { // <-- note the `async` on this line
return {
id: "my_id",
myValue: await service.getByValue(myValue)
}
});
};
Donc… il n'est pas possible de donner des recommandations sans voir le reste de votre application, mais en fonction de ce que vous essayez de faire, effectuez la fonction intérieure de manière asynchrone. ou essayez de trouver une architecture différente pour ce bloc.
Mise à jour: nous aurons peut-être une attente de premier niveau un jour: https://github.com/MylesBorins/proposal-top-level-await