Promise mang lại nhiều ưu điểm so với việc sử dụng callback trong JavaScript, giúp mã dễ đọc và dễ bảo trì hơn khi xử lý các tác vụ bất đồng bộ. Dưới đây là những ưu điểm chính của Promise so với callback:
.then()
), giúp mã tuần tự hơn và tránh lồng nhiều hàm vào bên trong nhau.Ví dụ với Callback Hell:
asyncOperation1(function(result1) { asyncOperation2(result1, function(result2) { asyncOperation3(result2, function(result3) { // Và tiếp tục ... }); }); });
Ví dụ với Promise:
asyncOperation1() .then(result1 => asyncOperation2(result1)) .then(result2 => asyncOperation3(result2)) .then(result3 => { // Và tiếp tục ... });
.catch()
để xử lý lỗi dễ dàng và nhất quán. Bất kỳ lỗi nào xảy ra trong chuỗi .then()
sẽ được bắt bởi .catch()
mà không cần phải xử lý từng lỗi trong từng callback.Callback với lỗi:
asyncOperation1(function(err, result1) { if (err) { // Xử lý lỗi } else { asyncOperation2(result1, function(err, result2) { if (err) { // Xử lý lỗi } else { // Tiếp tục ... } }); } });
Promise với lỗi:
asyncOperation1() .then(result1 => asyncOperation2(result1)) .then(result2 => asyncOperation3(result2)) .catch(error => { console.error("Lỗi xảy ra:", error); });
Promise.all()
, Promise.race()
, giúp thực hiện nhiều tác vụ bất đồng bộ cùng lúc một cách dễ dàng.Với Promise:
Promise.all([asyncOperation1(), asyncOperation2()]) .then(([result1, result2]) => { console.log(result1, result2); });
.then()
. Điều này giúp logic rõ ràng và không gây rối như khi lồng callback.Callback truyền thống:
asyncOperation1(function(result1) { asyncOperation2(result1, function(result2) { asyncOperation3(result2, function(result3) { console.log(result3); }); }); });
Promise:
asyncOperation1() .then(result1 => asyncOperation2(result1)) .then(result2 => asyncOperation3(result2)) .then(result3 => console.log(result3));
.catch()
.Promise.all()
hoặc Promise.race()
.Nhờ các ưu điểm này, Promise thường được ưa chuộng hơn so với callback trong lập trình JavaScript hiện đại.