Intellij Idea-Warnung – „Zurückgegebenes Versprechen wird ignoriert“ mit aysnc/await

Lesezeit: 6 Minuten

Benutzer-Avatar
Jyotman Singh

Ich benutze Express.js in meinem Code mit Node.js v7.3. In diesem habe ich eine erstellt User Router die die Anfragen an my weiterleitet User Controller.

Ich verwende async/await in der User Controller asynchrone Aufrufe durchzuführen. Das Problem ist, dass IntelliJ mir eine Warnung gibt, die das sagt

Das von login() zurückgegebene Promise wird ignoriert.

Die Sache ist, ich gebe nicht einmal etwas von der zurück login() Methode.

Hier ist der 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});
    }
};

Wenn ich dieselbe Anmeldemethode nur mit nativen Versprechungen schreibe, erhalte ich diese Warnung nicht. Verstehe ich hier etwas falsch oder ist IntelliJ schuld?

BEARBEITEN –

Dank @Stephen verstehe ich, dass eine asynchrone Funktion ein Versprechen zurückgibt, aber wäre es nicht besser, wenn Intellij feststellt, dass nichts von der asynchronen Funktion zurückgegeben wird, und diese Warnung nicht anzeigt, denn wenn ich a verkette .then() nach dem login() Funktion, es bietet eine undefined Objekt in das dann Ergebnis. Das heißt, wenn wir nicht explizit etwas von der async-Funktion zurückgeben, wird undefiniert zurückgegeben?

  • Während das Versprechen auflöst undefined, warnt Sie die IDE, dass Sie die Tatsache ignorieren, dass sie überhaupt auflöst oder ablehnt und wann. Es wäre schön, wenn Sie Funktionen als “das Versprechen von diesem kann sicher ignoriert werden” markieren könnten, damit Sie es nicht bei jeder Aufrufseite als ignoriert markieren müssen.

    – David Harkness

    8. September 2021 um 17:45 Uhr

Das userController.login() Die Funktion gibt ein Versprechen zurück, aber Sie tun nichts mit dem Ergebnis des Versprechens, indem Sie its verwenden then() Funktion.

Zum Beispiel:

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

oder in der ES2017-Syntax:

await userController.login(req, res);

Wenn Sie dort eigentlich nichts tun wollen, können Sie die Warnung einfach ignorieren. Die Warnung ist meistens da, weil das nicht verwendet wird then() Funktion auf einem Versprechen ist normalerweise ein Codegeruch.

  • Ist es also ein guter Ansatz, den Rückgabewert einer Promise-Funktion zu ignorieren, wenn ich ihn nicht in der Ausführungsserie meines Codes benötige?

    – NICHIL CM

    16. Oktober 2018 um 12:15 Uhr


  • Wenn es Ihnen wirklich egal ist, ob die Funktion erfolgreich ist oder fehlschlägt, und Sie nichts mit dem zurückgegebenen Wert tun möchten, nachdem das Promise aufgelöst wurde, können Sie getrost weglassen .then() Anruf.

    – Robba

    16. Oktober 2018 um 15:02 Uhr

  • Normalerweise mache ich let ignore = asyncFunction(); Dadurch hört intelliJ auf, sich zu beschweren (und es beschwert sich nicht über unbenutzte Variablen, wenn es Ignorieren heißt). Außerdem zeigt es, dass ich das Versprechen ausdrücklich ignoriere und es nicht nur vergessen habe.

    – Bob Vale

    27. Februar 2019 um 12:08 Uhr

  • @MarkusZeller dies unterscheidet sich jedoch funktional von der ursprünglichen Frage. In der ursprünglichen Frage wurde das Versprechen (absichtlich) ignoriert. Wenn Sie async/await verwenden, ignorieren Sie das Promise nicht mehr, aber alle Anweisungen nach dem await warten tatsächlich auf die Vervollständigung des Promise.

    – Robba

    17. August 2020 um 13:28 Uhr

  • @Robba Da es als letzten Ausdruck keine gibt, wird das kein Problem sein. Aber vielen Dank für dieses Detail, an das ich nicht gedacht habe.

    – Markus Zeller

    17. August 2020 um 14:03 Uhr


Die Sache ist, dass ich nicht einmal etwas von der Methode login() zurückgebe.

Eine als “async” deklarierte Funktion gibt per Definition ein Promise zurück. Siehe zum Beispiel https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

Die IDEA-Warnung ist jedoch nur eine Inspektion. Sie können bei der Warnung „alt-enter, right“ drücken und die Inspektionsebene ändern, damit die Warnung verschwindet. Die Inspektion befindet sich in der Kategorie “JavaScript -> Wahrscheinliche Fehler” und heißt “Ergebnis des Methodenaufrufs, der ein Versprechen zurückgibt, wird ignoriert”.

  • In WebStrom deaktivieren [Preferences] – [Editor] – [Inspection] – [JavaScript] – [Probable bugs] – [Result of method call returning a promise is ignored].

    – MJ-Studio

    16. Februar 2020 um 9:31 Uhr

  • In Idea deaktivieren [Preferences] – [Editor] – [Inspection] – [JavaScript and TypeScript] – [Async code and promises] – [Result of method call returning a promise is ignored].

    – Emmanuel Osimosu

    13. Juli 2020 um 16:58 Uhr

  • Es wäre schön, wenn es ein JetBrains-Äquivalent zu gäbe // eslint-disable-line .... Ist dort eines?

    – Jacobq

    11. Mai um 22:30 Uhr

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

Sie sollten den Operator “void” verwenden.

  • Dies ist meiner Meinung nach die beste Antwort. Das ist genau das, was void wurde für konzipiert. Von MDN: void ist für “Auswerten von Ausdrücken, die einen Wert an Stellen erzeugen, an denen ein Ausdruck erwünscht ist, der als undefiniert ausgewertet wird.”

    – ChrisCrossCrash

    13. April 2021 um 17:31 Uhr


  • Wenn ich das mache, wird SonarLint stattdessen mit a wütend auf mich Critical javascript:S3735 „„void“ sollte nicht verwendet werden“ mit der Beschreibung „Der void-Operator wertet sein Argument aus und gibt bedingungslos undefined zurück. Er kann in Umgebungen vor ECMAScript 5 nützlich sein, in denen undefined neu zugewiesen werden konnte, aber im Allgemeinen macht seine Verwendung den Code schwerer verständlich .”

    – Bryan K

    3. Dezember 2021 um 21:42 Uhr

  • Diese Antwort wäre besser mit einer Erklärung.

    – Escherholz

    27. Juni um 13:21 Uhr

  • @ChrisCrossCrash Also mit void ist der richtige Ansatz in Bezug auf den Kommentar von @BryanK?

    – Jakub Slowikowski

    16. August um 13:30 Uhr

  • Omg! Das ist die beste Antwort, aber auf den ersten Blick nicht verständlich. Die Erklärung muss vor dem Code-Snippet stehen, weil ich nur den Code und den Kommentar darin sehe, dann sah ich eine void-Anweisung, dann dachte ich, dass es das Ausprobieren sein sollte, ich habe es ausprobiert und gesehen, dass es funktioniert, dann sehe ich die Erklärung 😀

    – halbhlt

    gestern

Benutzer-Avatar
Fingerabdrücke

wenn du wirklich manisch bist wie ich und die then() nicht erforderlich ist, aber die Warnung verschwinden soll, ist eine mögliche Lösung:

functionWithAsync.error(console.error);

Eine andere Möglichkeit, die Warnung loszuwerden, ist die Definition eines Leerzeichens then():

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

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

  • Vielen Dank! Dies ist perfekt für Ionic-Vorlagen, damit Sie die Warnung nicht mit unordentlichen Kommentaren ignorieren oder in der IDE deaktivieren müssen.

    – Bürger

    17. Juli 2019 um 17:53 Uhr

Benutzer-Avatar
Nate Bunney

Wenn Sie diese Warnung einfach für eines der JetBrains-Produkte ausschalten möchten. Gehe zu

Preferences > Inspections > JavaScript and TypeScript | Async code and promises | Result of method call returning a promise is ignored und schalten Sie die Einstellung aus.

  • Vielen Dank! Dies ist perfekt für Ionic-Vorlagen, damit Sie die Warnung nicht mit unordentlichen Kommentaren ignorieren oder in der IDE deaktivieren müssen.

    – Bürger

    17. Juli 2019 um 17:53 Uhr

Benutzer-Avatar
Joe Keene

Ich benutze try{} catch(e){} in NodeJs und fand das einfach durch Hinzufügen Error() zum Ende der Funktion wurde die Warnung behoben.

Vollständiger Code:-

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

1212520cookie-checkIntellij Idea-Warnung – „Zurückgegebenes Versprechen wird ignoriert“ mit aysnc/await

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy