Nhưng đó có vẻ không phải là cách thích hợp để làm điều đó ..
Đó thực sự là cách thích hợp để làm điều đó (hoặc ít nhất là một cách thích hợp để làm điều đó). Đây là khía cạnh quan trọng của lời hứa, chúng là một đường ống và dữ liệu có thể được xoa bóp bởi các trình xử lý khác nhau trong đường ống.
Thí dụ:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("First handler", data);
return data.map(entry => entry * 10);
})
.then(data => {
console.log("Second handler", data);
});
( catch
Bỏ qua trình xử lý để ngắn gọn. Trong mã sản xuất, luôn luôn tuyên truyền lời hứa hoặc xử lý từ chối.)
Kết quả mà chúng ta thấy từ đó là:
Xử lý đầu tiên [1,2]
Xử lý thứ hai [10,20]
... bởi vì trình xử lý đầu tiên nhận độ phân giải của hai lời hứa ( 1
và 2
) dưới dạng một mảng, sau đó tạo một mảng mới với mỗi cái được nhân với 10 và trả về nó. Trình xử lý thứ hai nhận được những gì mà trình xử lý đầu tiên trả lại.
Nếu công việc bổ sung bạn đang làm là đồng bộ, bạn cũng có thể đặt nó vào trình xử lý đầu tiên:
Thí dụ:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("Initial data", data);
data = data.map(entry => entry * 10);
console.log("Updated data", data);
return data;
});
... nhưng nếu nó không đồng bộ, bạn sẽ không muốn làm điều đó vì nó sẽ bị lồng vào nhau và việc lồng vào nhau có thể nhanh chóng vượt khỏi tầm tay.
reject
một giá trị sauPromise
hàm ban đầu ? Hay việc ném một lỗi vào bất kỳ đâu trong chuỗi sẽ đưa bạn đến.catch()
? Nếu đúng như vậy thì điểmreject
đầu tiên là gì? Tại sao không chỉ ném lỗi? Cảm ơn một lần nữa,