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.

123voto

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

Vous devez utiliser l'opérateur "void".

83voto

Robba Points 486

El userController.login() renvoie une promesse, mais vous ne faites rien avec le résultat de la promesse en utilisant sa fonction then() fonction.

Par exemple :

userController.login(req, res).then(() => {
    // Do something after login is successful.
});

ou dans la syntaxe ES2017 :

await userController.login(req, res);

Si vous n'avez pas l'intention d'y faire quoi que ce soit, vous pouvez ignorer l'avertissement. L'avertissement est surtout présent parce que le fait de ne pas utiliser l'option then() sur une promesse est généralement une odeur de code.

3 votes

Cela devrait être la réponse ! L'OP explique clairement pourquoi IntelliJ s'affole avec une façon élégante de le gérer. La réponse de l'autre électeur vous dit simplement de l'ignorer.

2 votes

Alors, est-ce une bonne approche d'ignorer la valeur de retour d'une fonction de promesse si je n'en ai pas besoin dans la série d'exécution de mon code ?

1 votes

Si vous ne vous souciez pas vraiment de savoir si la fonction réussit ou échoue, et si vous ne voulez rien faire avec la valeur renvoyée une fois que la promesse a été résolue, vous pouvez omettre sans risque l'élément .then() appeler.

74voto

Stephen Friedrich Points 864

Le problème est que je ne renvoie rien de la méthode login().

Une fonction déclarée "async" renvoie une Promise par définition. Voir par exemple https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

Cependant, l'avertissement IDEA n'est qu'une inspection. Vous pouvez appuyer sur "alt-enter, droite" sur l'avertissement et changer le niveau d'inspection pour faire disparaître l'avertissement. L'inspection se trouve dans la catégorie "JavaScript -> Probable bugs" et s'appelle "Result of method call returning a promise is ignored".

9 votes

Dans WebStrom, désactivez [Préférences] - [Éditeur] - [Inspection] - [JavaScript] - [Bogues probables] - [Le résultat d'un appel de méthode renvoyant une promesse est ignoré].

4 votes

Dans Idea, désactivez [Préférences] - [Éditeur] - [Inspection] - [JavaScript et TypeScript] - [Code asynchrone et promesses] - [Le résultat d'un appel de méthode renvoyant une promesse est ignoré].

34voto

winter Points 996

Si vous êtes vraiment maniaque comme moi et le then() n'est pas nécessaire mais vous avez besoin que l'avertissement disparaisse, une solution possible est :

functionWithAsync.error(console.error);

17 votes

Ou functionWithAsync.catch(console.error); avec d'autres versions de Promise (comme celle de ionic 5.2).

1 votes

Vous n'expliquez pas pourquoi, mais c'est une très bonne solution parce qu'elle permet de gérer tous les rejets internes qui, autrement, pourraient être engloutis et non jetés. Si quelqu'un appelle promise.reject et que vous n'attendez pas ou ne traitez pas la promesse rejetée, elle disparaît. Souvent, dans mon code, je veux en fait lancer cette erreur afin d'arrêter l'exécution.

26voto

Alejandro Silva Points 341

Une autre façon de se débarrasser de l'avertissement est de définir un fichier vide. then() :

userController.login(req, res); // <- Get the warning here

userController.login(req, res).then(); // <- No warning

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