Trong Node.js, việc xử lý tác vụ bất đồng bộ (asynchronous tasks) là một khía cạnh quan trọng để đảm bảo ứng dụng chạy mượt mà và không bị chặn lại bởi các hoạt động đồng bộ. Trong bài viết này, chúng ta sẽ tìm hiểu cách xử lý tác vụ bất đồng bộ trong Node.js.
Sử dụng Callbacks
Callbacks là một cách phổ biến để xử lý tác vụ bất đồng bộ trong Node.js. Callbacks cho phép bạn chuyển một hàm vào một hàm khác như một tham số, và hàm được truyền vào sẽ được gọi lại sau khi tác vụ bất đồng bộ hoàn thành. Đây là một ví dụ đơn giản sử dụng callback trong Node.js:
function fetchData(callback) {
setTimeout(() => {
const data = 'Dữ liệu từ tác vụ bất đồng bộ';
callback(data);
}, 2000);
}
function processData(data) {console.log(‘Dữ liệu đã được xử lý:’, data);
}
fetchData(processData);
Trong ví dụ trên, fetchData
là một tác vụ bất đồng bộ, và nó sẽ gọi lại hàm processData
sau khi hoàn thành. Hàm processData
sẽ nhận dữ liệu từ tác vụ bất đồng bộ và xử lý nó. Kết quả sẽ được in ra console sau 2 giây.
Sử dụng Promises
Promises là một cách tiện lợi và mạnh mẽ hơn để xử lý tác vụ bất đồng bộ trong Node.js. Promises cho phép bạn xử lý các tác vụ bất đồng bộ theo cách tuần tự và sử dụng các phương thức như then
và catch
để xử lý kết quả hoặc lỗi. Đây là một ví dụ sử dụng Promises trong Node.js:
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const data = 'Dữ liệu từ tác vụ bất đồng bộ';
resolve(data);
}, 2000);
});
}
fetchData().then(data => {
console.log(‘Dữ liệu đã được xử lý:’, data);
})
.catch(error => {
console.error(‘Đã xảy ra lỗi:’, error);
});
Trong ví dụ trên, fetchData
trả về một Promise. Nếu tác vụ bất đồng bộ hoàn thành thành công, resolve
được gọi và dữ liệu được truyền vào hàm then
. Nếu xảy ra lỗi, reject
được gọi và lỗi được truyền vào hàm catch
. Kết quả được in ra console sau 2 giây.
Sử dụng Async/Await
Async/Await là một cú pháp mới được giới thiệu trong phiên bản ECMAScript 2017 và giúp xử lý tác vụ bất đồng bộ một cách đồng bộ hơn. Với Async/Await, bạn có thể viết mã bất đồng bộ dễ đọc và dễ hiểu hơn. Đây là một ví dụ sử dụng Async/Await trong Node.js:
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const data = 'Dữ liệu từ tác vụ bất đồng bộ';
resolve(data);
}, 2000);
});
}
async function processData() {try {
const data = await fetchData();
console.log(‘Dữ liệu đã được xử lý:’, data);
} catch (error) {
console.error(‘Đã xảy ra lỗi:’, error);
}
}
processData();
Trong ví dụ trên, hàm processData
được đánh dấu bằng từ khóa async
, cho phép sử dụng từ khóa await
trong nó. Khi gọi hàm fetchData
bên trong processData
sử dụng await
, quá trình xử lý sẽ tạm dừng cho đến khi Promise được giải quyết (hoặc bị từ chối). Sau đó, kết quả sẽ được gán vào biến data
và in ra console sau 2 giây.
Trên đây là một số cách xử lý tác vụ bất đồng bộ trong Node.js bằng callbacks, Promises và Async/Await. Việc sử dụng các cú pháp này giúp tăng khả năng đáp ứng và hiệu suất của ứng dụng bằng cách xử lý các tác vụ mà không chặn luồng chính. Tùy thuộc vào tình huống và sở thích của bạn, bạn có thể chọn cách phù hợp để xử lý tác vụ bất đồng bộ trong Node.js.