86 votes

Async / Await inside Array # map ()

Je reçois une erreur de temps 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 ne puis-je pas l'utiliser comme ça?

J'ai également essayé une autre façon, 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 
        }
    });
};
 

197voto

lonesomeday Points 95456

Vous ne pouvez pas faire ce que vous imaginez, parce que vous ne pouvez pas utiliser await si elle n'est pas directement à l'intérieur d'un async fonction.

La chose la plus sensée à faire ici serait de rendre la fonction transmise à l' map asynchrone. Cela signifie qu' map serait de retourner un tableau de promesses. Nous pouvons ensuite utiliser Promise.all pour obtenir le résultat lorsque toutes les promesses de retour. En tant que Promise.all lui-même renvoie une promesse, à l'extérieur de la fonction ne doit pas être async.

const someFunction = (myArray) => {
    const promises = myArray.map(async (myValue) => {
        return {
            id: "my_id",
            myValue: await service.getByValue(myValue)
        }
    });
    return Promise.all(promises);
}

15voto

helb Points 2184

C'est parce que la fonction en map n'est pas asynchrone, donc vous ne pouvez pas attendre dans l'instruction return. 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)
        }
    });
};

Essayer dans Babel REPL

Donc... il n'est pas possible de donner une recommandation, sans voir le reste de votre application, mais en fonction de ce que vous essayez de faire, soit faire l' intérieur de la fonction asynchrone ou essayez de venir avec une architecture différente de ce bloc.

Mise à jour: nous pourrions obtenir de haut niveau attendent un jour: https://github.com/MylesBorins/proposal-top-level-await

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X