web-dev-qa-db-fra.com

Async / attend dans le tableau # map ()

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 
        }
    });
};
31
MyTitle

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);
}
60
lonesomeday

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

Essayez-le dans Babel REPL

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

8
helb