javascript - Cảnh báo Intellij Idea - "Promise trả về bị bỏ qua" với async/await
Tôi đang sử dụng Express.js trong mã của mình với Node.js phiên bản 7.3. Trong đó, tôi đã tạo một User Router chuyển tiếp các yêu cầu đến User Controller của tôi.
Tôi đang sử dụng async/await bên trong User Controller để thực hiện các cuộc gọi bất đồng bộ. Vấn đề là IntelliJ cảnh báo tôi rằng
Lời hứa trả về từ login() bị bỏ qua.
Vấn đề là tôi thậm chí không trả về gì từ phương thức login().
Đây là mã -
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});
}
};
Nếu tôi viết cùng một phương thức đăng nhập chỉ sử dụng các promise gốc thì tôi không nhận được cảnh báo này. Liệu tôi có hiểu sai điều gì ở đây hay là lỗi do IntelliJ?
CHỈNH SỬA -
Nhờ @Stephen, tôi hiểu rằng một hàm async trả về một promise nhưng liệu có tốt hơn không nếu Intellij nhận biết rằng không có gì được trả về từ hàm async và không hiển thị cảnh báo đó, bởi khi tôi nối một .then() sau hàm login(), nó sẽ cung cấp một đối tượng undefined vào kết quả của then. Điều đó có nghĩa là nếu chúng ta không trả về thứ gì từ hàm async một cách rõ ràng thì undefined sẽ được trả về?
Câu trả lời #1
Bạn nên sử dụng toán tử "void".
Theo MDN: void dùng để "đánh giá các biểu thức tạo ra một giá trị vào những nơi mà một biểu thức đánh giá thành undefined là mong muốn."
router.post('/login', function (req, res, next) {
void userController.login(req, res); // Warning will not be shown now
});Câu trả lời #2
Hàm userController.login() trả về một promise, nhưng bạn không làm gì với kết quả từ promise bằng cách sử dụng hàm then() của nó.
Ví dụ:
userController.login(req, res).then(() => {
// Do something after login is successful.
});
hoặc trong cú pháp ES2017:
await userController.login(req, res);
Nếu bạn thực sự không muốn làm gì ở đó, tôi đoán bạn chỉ có thể bỏ qua cảnh báo đó. Cảnh báo chủ yếu xuất hiện vì việc không sử dụng hàm then() trên một promise thường là một dấu hiệu mã không tốt.
Câu trả lời #3
Vấn đề là tôi thậm chí không trả về gì từ phương thức login().
Một hàm được khai báo là "async" theo định nghĩa sẽ trả về một Promise. Xem ví dụ tại https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
Tuy nhiên, cảnh báo IDEA chỉ là một kiểm tra. Bạn có thể nhấn "alt-enter, right" trên cảnh báo và thay đổi mức độ kiểm tra để cảnh báo biến mất. Kiểm tra này nằm trong mục "JavaScript -> Probable bugs" và có tên là "Result of method call returning a promise is ignored".
Câu trả lời #4
nếu bạn thực sự bị hưng cảm như tôi và then() không cần thiết nhưng bạn muốn cảnh báo biến mất, một giải pháp khả thi là:
functionWithAsync.error(console.error);
// or use a logger
functionWithAsync.error(log.error);
Câu trả lời số 5
một cách khác để loại bỏ cảnh báo là định nghĩa một then() trống:
userController.login(req, res); // <- Get the warning hereuserController.login(req, res).then(); // <- No warningCâu trả lời số 6
Nếu bạn chỉ muốn tắt cảnh báo này cho bất kỳ sản phẩm nào của JetBrains, hãy đi đến
Preferences > Inspections > JavaScript và TypeScript | Mã bất đồng bộ và lời hứa | Kết quả của cuộc gọi phương thức trả về một promise bị bỏ qua và tắt thiết lập này.
