Làm việc với mảng promise trong JavaScript
Bây giờ chúng ta sẽ phân tích hai phương thức hữu ích,
cho phép làm việc với mảng promise.
Phương thức Promise.all cho phép thực thi
mã khi tất cả các promise được truyền
vào nó dưới dạng mảng hoàn thành,
còn phương thức Promise.race
chờ promise đầu tiên trong mảng hoàn thành,
và bỏ qua các promise còn lại.
Cả hai phương thức đều trả về một promise mới
làm kết quả. Đối với phương thức Promise.all, kết quả
của promise này sẽ là một mảng chứa kết quả của tất cả
các promise được truyền vào (thứ tự kết quả
tương ứng với thứ tự promise trong mảng),
còn đối với Promise.race - kết quả của promise
đầu tiên hoàn thành.
Hãy xem xét trong thực tế. Giả sử chúng ta có một mảng promise:
let promises = [
new Promise(resolve => setTimeout(() => resolve(1), 1000)),
new Promise(resolve => setTimeout(() => resolve(2), 2000)),
new Promise(resolve => setTimeout(() => resolve(3), 3000)),
];
Hãy sử dụng Promise.all để chờ
tất cả các promise trong mảng của chúng ta
hoàn thành:
Promise.all(promises).then(function(res) {
console.log(res); // sẽ in ra [1, 2, 3] - kết quả của tất cả các promise
});
Và bây giờ sử dụng Promise.race để chờ
hoàn thành promise đầu tiên:
Promise.race(promises).then(function(res) {
console.log(res); // sẽ in ra 1 - kết quả của promise đầu tiên hoàn thành
});
Nếu ít nhất một promise trong mảng bị
từ chối, thì promise kết quả sẽ ngay lập tức
chuyển sang trạng thái rejected. Do đó
ngoại lệ xảy ra có thể được bắt bằng cách thông thường,
đã được bạn học, ví dụ thông qua
catch:
Promise.all(promises).then(function(res) {
console.log(res);
}).catch(function(err) {
console.log(err);
});
Tạo một hàm trả về một promise, bên trong
nó thiết lập độ trễ ngẫu nhiên từ
1 đến 10 giây. Hãy để kết quả của promise
là chính độ trễ đó.
Sử dụng vòng lặp và hàm của bạn để điền
mảng với 10 promise.
Sử dụng mảng promise từ bài tập trước làm sao để in ra console kết quả của promise đầu tiên hoàn thành.
Sử dụng mảng promise từ bài tập trước làm sao để in ra console tổng kết quả của tất cả các promise.