Intellij Idea-Warnung – „Zurückgegebenes Versprechen wird ignoriert“ mit aysnc/await
Lesezeit: 6 Minuten
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.
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
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
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
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.
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