Top 5 Sai Lầm Khi Xử Lý Async Trong Node.js
Node.js nổi tiếng với khả năng xử lý bất đồng bộ (async) siêu mượt, nhờ vào event loop và non-blocking I/O. Nhưng nếu bạn không hiểu rõ cơ chế này, rất dễ dính “bug vô hình” hoặc làm hiệu năng tụt dốc không phanh.
Dưới đây là 5 sai lầm phổ biến nhất khi xử lý async mà mình gặp thấy (và từng phạm phải 😅):
1. Quên await
hoặc .then()
khi gọi hàm async
Ví dụ sai:
const data = fetchData(); // fetchData là hàm async
console.log(data); // sẽ in ra Promise { <pending> }
Giải pháp đúng:
const data = await fetchData();
Hoặc:
fetchData().then(data => console.log(data));
Nhớ: Nếu bạn thấy output là [object Promise]
, tức là bạn đã quên await
.
2. Dùng await
trong vòng lặp forEach
myArray.forEach(async (item) => {
await doSomething(item); // KHÔNG hoạt động như bạn nghĩ
});
forEach
không đợi await
, nên mọi thứ chạy cùng lúc.
Cách đúng:
for (const item of myArray) {
await doSomething(item);
}
Hoặc nếu muốn chạy song song:
await Promise.all(myArray.map(item => doSomething(item)));
3. Không xử lý lỗi với try/catch
hoặc .catch()
const result = await mayThrowError(); // nếu lỗi xảy ra, app crash
Nên bọc trong try/catch:
try {
const result = await mayThrowError();
} catch (err) {
console.error('Error happened:', err);
}
Hoặc với Promise:
mayThrowError().catch(err => console.error(err));
4. Chặn event loop bằng tác vụ đồng bộ nặng
app.get('/', (req, res) => {
// Blocking code
for (let i = 0; i < 1e10; i++) {}
res.send('Done');
});
Tác vụ trên sẽ** chặn toàn bộ server**, vì JavaScript chỉ có 1 thread chạy chính.
Cách giải quyết:
- Tách ra thành child process hoặc
- Dùng Worker Threads nếu là Node >= 12
- Hoặc đơn giản: tránh xử lý nặng trong main thread
5. Không chờ tất cả Promise hoàn thành
const tasks = [task1(), task2(), task3()];
tasks.forEach(async t => await t); // SAI – không đợi
Cách đúng:
await Promise.all([task1(), task2(), task3()]);
Tổng kết
Xử lý async là cốt lõi của Node.js, nhưng cũng dễ gây "ngơ ngác, bật ngửa" nếu bạn chưa quen. Nắm chắc các nguyên tắc trên sẽ giúp bạn:
- Viết code rõ ràng, dễ debug
- Tránh bug ngầm
- Tối ưu hiệu năng hệ thống
All rights reserved