Intellij Idea warning - "Обещанное возвращение проигнорировано" с помощью aysnc/wait
Я использую Express.js в своем коде с Node.js v7.3. В этом я создал User Router
, который перенаправляет запросы на мой User Controller
.
Я использую async/await внутри User Controller
для выполнения асинхронных вызовов. Проблема в том, что IntelliJ дает мне предупреждение, говорящее, что
Обещание, возвращенное из login(), игнорируется.
Дело в том, что я даже ничего не возвращаю из метода 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});
}
};
Если я напишу один и тот же метод входа, используя собственный promises, то я не получу это предупреждение. Я понимаю что-то неправильно здесь или IntelliJ по вине?
EDIT -
Благодаря @Stephen я понимаю, что функция async возвращает обещание, но не лучше ли Intellij идентифицировать, что ничего не возвращается из асинхронной функции и не отображает это предупреждение, потому что когда я цепляю .then()
после функции login()
, он предоставляет объект undefined
в результат then. Это означает, что если мы не возвращаем что-то из асинхронной функции явно, возвращается undefined?
Ответы
Ответ 1
Дело в том, что я даже ничего не возвращаю из метода login().
Функция, объявленная async, возвращает Promise по определению. Смотрите, например, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
Однако предупреждение IDEA - это только проверка. Вы можете нажать "alt-enter, right" в предупреждении и изменить уровень проверки, чтобы предупреждение исчезло. Проверка находится в категории "JavaScript → Вероятные ошибки" и называется "Результат вызова метода, возвращающего обещание, игнорируется".
Ответ 2
Функция userController.login()
возвращает обещание, но вы ничего не делаете с результатом обещания, используя функцию then()
.
Например:
userController.login(req, res).then(() => {
// Do something after login is successful.
});
или в синтаксисе ES2017:
await userController.login(req, res);
Если вы на самом деле ничего не хотите делать, я думаю, вы можете просто игнорировать предупреждение. Предупреждение в основном происходит потому, что не использовать функцию then()
в обещании, как правило, является запахом кода.
Ответ 3
если вы действительно сошли с ума, как я, и then()
не требуется, но вам нужно предупреждение, чтобы уйти, возможное решение:
functionWithAsync.error(console.error);
Ответ 4
Еще один способ избавиться от предупреждения - определить пустое значение then()
:
userController.login(req, res);//<- Get the warning here
userController.login(req, res).then();//<- No warning