Intellij Idea warning - “Promise returned is ignored” with aysnc/await

一个人想着一个人 提交于 2019-12-18 13:54:12

问题


I'm using Express.js in my code with Node.js v7.3. In this I've created a User Router which forwards the requests to my User Controller.

I'm using async/await inside the User Controller to do asynchronous calls. The problem is that IntelliJ gives me a warning saying that

Promise returned from login() is ignored.

The thing is I'm not even returning anything from the login() method.

Here's the 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});
    }
};

If I write the same login method using native promises only then I don't get this warning. Am I understanding something wrong here or is IntelliJ at fault?

EDIT -

Thanks to @Stephen, I understand that an async function returns a promise but wouldn't it be better if Intellij identifies that nothing is being returned from the async function and doesn't show that warning because when I chain a .then() after the login() function, it provides an undefined object into the then result. It means if we don't return something from the async function explicitly then undefined is returned?


回答1:


The thing is I'm not even returning anything from the login() method.

A function declared "async" returns a Promise by definition. See for example https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

However the IDEA warning is only an inspection. You can press "alt-enter, right" on the warning and change the inspection level to make the warning go away. The inspection is in the "JavaScript -> Probable bugs" category and is named "Result of method call returning a promise is ignored".




回答2:


The userController.login() function returns a promise, but you're not doing anything with the result from the promise by utilizing its then() function.

For example:

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

or in the ES2017 syntax:

await userController.login(req, res);

If you don't actually want to do anything there, I guess you can just ignore the warning. The warning is mostly there because not using the then() function on a promise is usually a code smell.




回答3:


another way to get rid of the warning is defining an empty then():

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

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




回答4:


if you are really manic as me and the then() is not required but you need the warning to go away, a possible solution is:

functionWithAsync.error(console.error);


来源:https://stackoverflow.com/questions/41278900/intellij-idea-warning-promise-returned-is-ignored-with-aysnc-await

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!