Intellij Idea警告 - 使用aysnc / await忽略“返回的Promise”

时间:2016-12-22 08:38:03

标签: javascript node.js intellij-idea async-await es6-promise

我在 Node.js v7.3的代码中使用 Express.js 。在此,我创建了一个User Router,将请求转发给我的User Controller

我在User Controller内使用async / await来进行异步调用。问题是IntelliJ给了我一个警告说

  

忽略从login()返回的Promise。

问题是我甚至没有从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,我知道async函数会返回一个promise,但如果Intellij发现没有从async函数返回任何内容并且没有显示该警告,因为当我链接{{{ 1}}在.then()函数之后,它在then结果中提供了一个login()对象。这意味着如果我们没有显式地从异步函数返回一些东西,那么会返回undefined吗?

7 个答案:

答案 0 :(得分:28)

  

问题是我甚至没有从login()方法返回任何内容。

声明为“async”的函数按定义返回Promise。 请参阅示例this

然而,IDEA警告只是一次检查。您可以在警告上按“alt-enter,right”并更改检查级别以使警告消失。 检查位于“JavaScript - >可能的错误”类别中,并命名为“返回承诺的方法调用结果被忽略”。

答案 1 :(得分:25)

userController.login()函数会返回一个承诺,但您不会使用其then()函数对承诺的结果做任何事情。

例如:

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

或ES2017语法:

await userController.login(req, res);

如果你真的不想在那里做任何事情,我想你可以忽略这个警告。警告主要在那里,因为在承诺上不使用then()函数通常是代码气味。

答案 2 :(得分:5)

我在NodeJ中使用try{} catch(e){},发现仅在函数末尾添加Error()即可解决警告。

完整代码:-

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

答案 3 :(得分:4)

如果您真的像我一样狂躁,并且不需要then(),但是您需要警告消失,那么可以选择以下替代方法:

functionWithAsync.error(console.error);

答案 4 :(得分:2)

如果您只是想为任何 JetBrains 产品关闭此警告。前往

Preferences > Inspections > JavaScript and TypeScript | Async code and promises | Result of method call returning a promise is ignored 并关闭设置。

答案 5 :(得分:1)

摆脱警告的另一种方法是定义一个空的then()

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

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

答案 6 :(得分:1)

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

您应该使用“ void”运算符。