Promise
là một đối tượng đại diện cho một giá trị mà tại một thời điểm nào đó sẽ có kết quả (resolved) hoặc bị lỗi (rejected). Nó cho phép bạn làm việc với các tác vụ bất đồng bộ một cách dễ quản lý hơn.
Một Promise
có thể có ba trạng thái:
Bạn có thể tạo một Promise
bằng cách sử dụng từ khóa new Promise()
, truyền vào một hàm có hai đối số: resolve
và reject
.
let myPromise = new Promise(function(resolve, reject) { // Thực hiện một tác vụ bất đồng bộ let success = true; if (success) { resolve("Tác vụ hoàn thành thành công!"); } else { reject("Có lỗi xảy ra!"); } });
then()
và catch()
Sau khi tạo một Promise, bạn có thể xử lý kết quả của nó bằng cách sử dụng các phương thức .then()
và .catch()
để làm việc với trạng thái resolved
và rejected
tương ứng.
myPromise .then(function(result) { console.log(result); // In ra: Tác vụ hoàn thành thành công! }) .catch(function(error) { console.log(error); // In ra: Có lỗi xảy ra! (nếu tác vụ thất bại) });
Trong ví dụ sau, chúng ta sử dụng Promise để mô phỏng một yêu cầu HTTP giả lập (giả sử dùng setTimeout
để tạo tác vụ bất đồng bộ):
function makeRequest() { return new Promise(function(resolve, reject) { setTimeout(function() { let success = true; // Giả lập thành công yêu cầu if (success) { resolve("Dữ liệu đã được lấy thành công."); } else { reject("Có lỗi xảy ra khi lấy dữ liệu."); } }, 2000); // Mô phỏng tác vụ mất 2 giây }); } makeRequest() .then(function(response) { console.log(response); // Kết quả: Dữ liệu đã được lấy thành công. }) .catch(function(error) { console.log(error); // Trường hợp lỗi sẽ in thông báo lỗi. });
Bạn có thể kết nối các Promises lại với nhau bằng cách sử dụng nhiều .then()
:
makeRequest() .then(function(response) { console.log(response); // Kết quả: Dữ liệu đã được lấy thành công. return "Bước tiếp theo sau khi nhận dữ liệu."; }) .then(function(nextStep) { console.log(nextStep); // In ra: Bước tiếp theo sau khi nhận dữ liệu. }) .catch(function(error) { console.log(error); });
Promise.all()
cho phép bạn xử lý nhiều Promise cùng một lúc, chỉ khi tất cả các Promise được hoàn thành thì kết quả mới được trả về. Nếu bất kỳ Promise nào bị từ chối, Promise.all sẽ ngay lập tức bị từ chối.
let promise1 = Promise.resolve("Promise 1 hoàn thành."); let promise2 = new Promise(function(resolve) { setTimeout(resolve, 1000, "Promise 2 hoàn thành sau 1 giây."); }); Promise.all([promise1, promise2]) .then(function(results) { console.log(results); // Kết quả: ["Promise 1 hoàn thành.", "Promise 2 hoàn thành sau 1 giây."] });
Promise
giúp xử lý các tác vụ bất đồng bộ dễ quản lý hơn..then()
để xử lý kết quả khi Promise thành công và .catch()
để xử lý lỗi khi Promise thất bại.Promise.all()
giúp bạn chạy nhiều Promises đồng thời và chỉ trả kết quả khi tất cả Promises hoàn thành.