แต่ดูเหมือนจะไม่ใช่วิธีที่เหมาะสม ..
นั่นเป็นวิธีที่เหมาะสมที่จะทำ (หรืออย่างน้อยก็เป็นวิธีที่เหมาะสมที่จะทำ) นี่คือลักษณะสำคัญของคำสัญญาเป็นท่อและข้อมูลสามารถถูกนวดโดยตัวจัดการต่างๆในท่อ
ตัวอย่าง:
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
จัดการละเว้นสำหรับความกะทัดรัด. ในรหัสการผลิต, เสมอทั้งเผยแพร่สัญญาหรือการจัดการปฏิเสธ.)
ผลลัพธ์ที่เราเห็นคือ:
เครื่องจัดการคนแรก [1,2]
มือสอง [10,20]
... เนื่องจากตัวจัดการแรกได้รับความละเอียดของสัญญาทั้งสอง ( 1
และ2
) เป็นอาร์เรย์จากนั้นจึงสร้างอาร์เรย์ใหม่โดยแต่ละตัวคูณด้วย 10 แล้วส่งกลับ ตัวจัดการมือสองจะได้รับสิ่งที่ตัวจัดการแรกส่งคืน
หากงานเพิ่มเติมที่คุณทำอยู่เป็นแบบซิงโครนัสคุณสามารถวางไว้ในตัวจัดการแรกได้:
ตัวอย่าง:
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;
});
... แต่ถ้าเป็นแบบอะซิงโครนัสคุณจะไม่ต้องการทำเช่นนั้นเมื่อมันถูกซ้อนกันและการทำรังจะหลุดมือไปอย่างรวดเร็ว
reject
ให้ค่าหลังจากPromise
ฟังก์ชันเริ่มต้น? หรือจะโยนข้อผิดพลาดที่ใดก็ได้ในห่วงโซ่จะพาคุณไป.catch()
? ถ้าเป็นเช่นนั้นจุดเริ่มต้นreject
คืออะไร? ทำไมไม่เพียงแค่โยนข้อผิดพลาด? ขอขอบคุณอีกครั้ง