140 votes

Avertissement Intellij Idea - "La promesse retournée est ignorée" avec aysnc/await

J'utilise Express.js dans mon code avec Node.js v7.3. Dans ce cas, j'ai créé un User Router qui transmet les demandes à mon User Controller .

J'utilise async/await à l'intérieur des User Controller pour effectuer des appels asynchrones. Le problème est qu'IntelliJ me donne un avertissement disant que

La promesse retournée par login() est ignorée.

Le truc, c'est que je ne renvoie rien du tout du login() méthode.

Voici le code -

UserRouter.js

router.post('/login', function (req, res, next) {
    userController.login(req, res); // I get the warning here
});

UserController.js

exports.login = async function (req, res) {
    try {
        const verifiedUser = await someFunction(req.body.access_code);
        let user = await User.findOrCreateUser(verifiedUser);
        res.status(200).send(user);
    }
    catch (err) {
        res.status(400).send({success: false, error: err});
    }
};

Si j'écris la même méthode de connexion en utilisant uniquement des promesses natives, je n'obtiens pas cet avertissement. Ai-je mal compris quelque chose ou est-ce la faute d'IntelliJ ?

EDIT -

Merci à @Stephen, je comprends qu'une fonction asynchrone renvoie une promesse mais ne serait-il pas mieux qu'Intellij identifie que rien n'est renvoyé par la fonction asynchrone et n'affiche pas cet avertissement car lorsque j'enchaîne un .then() après le login() il fournit une fonction undefined dans le résultat final. Cela signifie que si nous ne retournons pas explicitement quelque chose de la fonction asynchrone, alors undefined est retourné ?

1 votes

Alors que la promesse se résume à undefined L'IDE vous avertit que vous ne tenez pas compte du fait qu'il résout ou rejette du tout et quand. Ce serait bien si vous pouviez marquer les fonctions comme "la promesse de ceci peut être ignorée en toute sécurité" afin que vous n'ayez pas à la marquer comme ignorée à chaque site d'appel.

9voto

Nathan Bunney Points 231

Si vous voulez simplement désactiver cet avertissement pour n'importe lequel des produits JetBrains. Allez à

Preferences > Inspections > JavaScript and TypeScript | Async code and promises | Result of method call returning a promise is ignored et désactiver le réglage.

7voto

Joe Keene Points 1064

J'utilise try{} catch(e){} dans NodeJs et j'ai constaté que le simple fait d'ajouter Error() à la fin de la fonction a corrigé l'avertissement.

Code complet:-

someArray.forEach(async (arrayValue) => {
    try {
        const prodData = await myAsyncFunc(arrayValue);
    } catch(e) {
        console.error(`Error: ${e}`);
    }
}, Error());

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