提问者:小点点

Intellij Idea警告-返回的promise被忽略,使用AYSNC/AWAIT


我在Node.jsV7.3的代码中使用express.js。在这里,我创建了一个,它将请求转发给我的

我正在使用中的async/await执行异步调用。问题是IntelliJ给了我一个警告说

忽略从login()返回的承诺。

问题是,我甚至没有从方法返回任何东西。

这是密码-

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});
    }
};

如果只使用本机承诺编写相同的登录方法,则不会收到此警告。是我理解错了还是IntelliJ错了?

编辑-

感谢@stephen,我理解了异步函数返回一个承诺,但如果Intellij识别出异步函数没有返回任何东西,并且不显示警告,这不是更好吗,因为当我将链接到函数之后时,它将向then结果提供一个对象。这意味着如果我们没有显式地从异步函数返回一些东西,那么就会返回undefined?


共3个答案

匿名用户

问题是,我甚至没有从login()方法返回任何东西。

声明为“async”的函数根据定义返回一个承诺。例如,请参见https://developer.mozilla.org/en-us/docs/web/javascript/reference/statements/async_function

然而,观念警示只是一种检查。您可以在警告上按“Alt-Enter,Right”,并更改检查级别以使警告消失。该检查属于“JavaScript-&>可能的错误”类别,名为“方法调用返回承诺的结果被忽略”(result of method call returning a promise is ignored)。

匿名用户

函数返回一个promise,但是您不会通过使用它的函数来处理promise的结果。

例如:

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

或者在ES2017语法中:

await userController.login(req, res);

如果你实际上不想在那里做任何事情,我猜你可以忽略警告。之所以出现警告,主要是因为没有在promise上使用函数通常是一种代码气味。

匿名用户

如果您真的像我一样狂躁,并且不需要,但是您需要离开警告,一个可能的解决方案是:

functionWithAsync.error(console.error);