Thời gian đọc: 4 phút
Dưới đây là sự khác biệt giữa Promise
, Callback
, và Async/Await
trong JavaScript với hướng dẫn chi tiết về cách sử dụng chúng.
Callback là một hàm được truyền vào một hàm khác như một đối số và được gọi khi hàm đó hoàn thành công việc của nó. Đây là cách cũ để xử lý bất đồng bộ trong JavaScript.
function doSomething(callback) {
setTimeout(() => {
console.log('Đã hoàn thành công việc');
callback(); // gọi callback sau khi công việc hoàn thành
}, 1000);
}
doSomething(() => {
console.log('Callback được gọi');
});
Promise là một đối tượng đại diện cho giá trị có thể có ở hiện tại hoặc trong tương lai. Nó có thể ở một trong ba trạng thái: pending
(đang chờ), fulfilled
(hoàn thành), hoặc rejected
(thất bại). Promise giúp giải quyết vấn đề “Callback Hell” bằng cách cho phép bạn xử lý kết quả bất đồng bộ theo một cách dễ đọc hơn.
function doSomething() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Đã hoàn thành công việc');
resolve(); // gọi resolve khi công việc hoàn thành
}, 1000);
});
}
doSomething()
.then(() => {
console.log('Promise đã được hoàn thành');
})
.catch((error) => {
console.log('Có lỗi xảy ra: ', error);
});
catch
để xử lý lỗi.Async/Await
là một cú pháp mới trong JavaScript được giới thiệu trong ES2017 (ES8) giúp làm việc với Promise dễ dàng hơn. async
đánh dấu một hàm là bất đồng bộ và await
chờ Promise hoàn thành.
function doSomething() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Đã hoàn thành công việc');
resolve(); // gọi resolve khi công việc hoàn thành
}, 1000);
});
}
async function run() {
try {
await doSomething(); // chờ Promise hoàn thành
console.log('Async/Await đã được hoàn thành');
} catch (error) {
console.log('Có lỗi xảy ra: ', error);
}
}
run();
.then
, bạn viết mã theo cách đồng bộ.try/catch
để xử lý lỗi giống như trong mã đồng bộ.then
và catch
..then
, có thể vẫn gây khó khăn khi lồng nhau nhiều.Hy vọng hướng dẫn này giúp bạn hiểu rõ hơn về các cách xử lý bất đồng bộ trong JavaScript! Nếu bạn có thêm câu hỏi hoặc cần thông tin chi tiết hơn, đừng ngần ngại hỏi nhé.