มาตรฐานใหม่เพิ่มสัญญาดั้งเดิม
ที่นี่เราจะหารือเกี่ยวกับการใช้โซ่และคิดถึงรายละเอียดเท่านั้น
1. ทบทวน () และจับ ()
ฟังก์ชันการเรียกกลับสามารถวางไว้ในพารามิเตอร์ของตอนนั้น () และ catch () เพื่อรับผลลัพธ์สุดท้ายของสัญญา
จากนั้น () สามารถรับพารามิเตอร์การโทรกลับนี้จะถูกเรียกเฉพาะเมื่อสัญญาแก้ไข ()
จากนั้น () ยังสามารถรับพารามิเตอร์ที่สองและการเรียกกลับครั้งที่สองจะใช้เพื่อจัดการสถานการณ์การปฏิเสธสัญญา ()
Catch () จัดการสถานการณ์การปฏิเสธ () โดยเฉพาะ
กล่าวอีกนัยหนึ่ง () สามารถใช้ทั้งสองวิธีและ catch () สามารถจัดการกับการปฏิเสธ () เท่านั้น อย่างไรก็ตามขอแนะนำให้ใช้ () เพื่อจัดการการแก้ไข () และ catch () เพื่อจัดการการปฏิเสธ ()
2. อย่างไรก็ตามสิ่งที่ฉันต้องการพูดถึงไม่ใช่ข้างต้น ข้างต้นเป็นเพียงการตรวจสอบการใช้งานขั้นพื้นฐาน ที่นี่เราจะเริ่มต้นด้วยรายละเอียดของค่าส่งคืนและการใช้โซ่ของตอนนั้น () และวิธีการ ()
จากนั้นเอกสารอย่างเป็นทางการบอกว่าทั้ง () และจับ () ส่งคืนสัญญาซึ่งน่าสนใจมาก (ฉันเป็นมือใหม่ใน JS และฉันไม่เคยได้รับสัญญาก่อนหน้านี้ในป่า)
ก่อนอื่นสัญญาที่ส่งคืนใหม่นี้ไม่ใช่สัญญาดั้งเดิม
ประการที่สองการเปลี่ยนแปลงในสถานะของสัญญาที่ส่งคืนใหม่ (แก้ไข () หรือปฏิเสธ ()) เกี่ยวข้องกับสถานะของสัญญาก่อนหน้านี้และวิธีการที่ () ถูกใช้
ก่อนอื่นอธิบายสถานการณ์ของตอนนั้น (): (จับคล้ายกัน)
var p1 = pression.resolve ("ความสำเร็จ"); var p2 = p1. จากนั้น (task1); var p3 = p2. จากนั้น (task2);หมายเหตุ: Task1 และ Task2 ข้างต้นเป็นทั้งการโทรกลับ
ที่นี่ P1 เป็นสัญญาที่สร้างขึ้นและแก้ไขโดยตรง ();
P2 เป็นสัญญาที่ได้รับแล้ว () และ P3 ก็เป็นสัญญาที่ได้รับแล้ว ()
ดังนั้นสถานะของ P2 เปลี่ยนไปอย่างไรและ P3 เป็นอย่างไร?
ฉันจะใช้ตัวเลขต่อไปนี้เพื่ออธิบายแนวคิดนี้:
ใน,
1. แปดเหลี่ยมหมายถึงวัตถุสัญญา
2. วงกลมแสดงถึงสถานะภายในสัญญาและลูกศรสีดำแสดงถึงการเปลี่ยนแปลงของรัฐ
3. ลูกศรขวาหมายถึงการเรียกใช้ฟังก์ชัน
4. นั่นคือตราบใดที่ฟังก์ชั่นนั้นเรียกว่าวัตถุสัญญาใหม่จะถูกสร้างขึ้น
5. เมื่อเรียกฟังก์ชั่นแล้วไม่ทราบว่าสถานะของวัตถุสัญญาก่อนหน้านี้คืออะไรไม่ว่าจะอยู่ระหว่างดำเนินการหรือตัดสิน? สิ่งนี้ไม่สามารถสันนิษฐานได้และไม่สามารถมองเห็นได้ภายนอก
6. การเรียกใช้ฟังก์ชันนั้นจะไม่บล็อกนั่นคือ P2 และ P3 ถูกสร้างขึ้นเกือบจะทันทีแม้ว่า P1 จะยังคงย้ายสถานะของตัวเองอย่างช้าๆ
เรารู้ว่าสถานะของ P1 ได้รับการแก้ไข (ดูรหัสด้านบน) อย่างไรก็ตามยังไม่ได้อธิบายที่นี่ว่าสถานะของการเปลี่ยนแปลง P2 และ P3 ได้รับการแก้ไขหรือปฏิเสธหรือไม่? ดูภาพใหม่ด้านล่าง
คุณสามารถดูเพชรได้มากขึ้น
เพชรแสดงฟังก์ชั่นการโทรกลับผ่านเมื่อเรียกว่า รูปสี่เหลี่ยมขนมเปียกปูนขึ้นแสดงถึงกระบวนการของการถูกส่งผ่านใน [แก้ไขสำหรับวัตถุสัญญาก่อนหน้า] และรูปสี่เหลี่ยมขนมเปียกปูนลงแสดงถึงกระบวนการของการถูกส่งผ่านใน [ปฏิเสธสำหรับวัตถุสัญญาก่อนหน้า]
หมายเหตุ: ในตัวอย่างนี้ไม่มีการประมวลผลสำหรับการปฏิเสธถูกส่งผ่านนั่นคือไม่ควรวาดเพชรลงในภาพด้านบน เพื่อความสะดวกเราจำเป็นต้องรู้ว่าเพชรขึ้นและลงนั้นเกี่ยวข้องกับวิธีที่เราใช้หรือจับ มาดูรหัสตัวอย่างอีกครั้ง:
var p1 = promise.resolve ("ความสำเร็จ"); var p2 = p1. จากนั้น (task1); // rhombus ขึ้นไปสร้าง var p3 = p2. จากนั้น (task2); // rhombus ขึ้นไปถูกสร้างขึ้นจะเห็นได้ว่าเราไม่ให้พารามิเตอร์ที่สองในตอนนั้นนั่นคือเราไม่จัดการกับการปฏิเสธ
หากต้องการเพิ่มหากคุณต้องการจัดการกับการปฏิเสธคุณสามารถใช้หรือจับได้ Catch ใช้เป็นพิเศษเพื่อจัดการกับการปฏิเสธ นอกเหนือจากนั้นไม่มีความแตกต่างระหว่างนั้น
1. หากสถานะสุดท้ายของ P1 (แก้ไขหรือปฏิเสธ) ถูกประมวลผลอย่างถูกต้อง (เมื่อโทรไปแล้วการโทรกลับที่สอดคล้องกันจะถูกส่งผ่านนั่นคือมีเพชรที่สอดคล้องกัน) สถานะของ P2 จะถูกเปลี่ยนเพื่อแก้ไข
2. หากสถานะสุดท้ายของ P1 (แก้ไขหรือปฏิเสธ) ไม่ถูกประมวลผลอย่างถูกต้อง (เมื่อโทรไปแล้วการโทรกลับที่เกี่ยวข้องจะหายไปนั่นคือไม่มีเพชรที่สอดคล้องกัน) สถานะของ P1 จะถูกส่งไปยัง P2 (สถานะของการรับ P1)
3. ส่งต่อแบบนี้
4. บทความนี้ไม่ได้อธิบายวิธีการรับข้อมูลสุดท้ายสัญญาสุดท้ายในการโทรกลับนั่นคือวิธีการส่งข้อมูลมีบทเรียนมากมาย
3. นี่คือตัวอย่างบางส่วนเพื่อสรุปบทความนี้
ในรูปที่สถานะของ P1 จะได้รับและแก้ไขหรือปฏิเสธโดยตัวเอง เป้าหมายคือการเปิดตัวสถานะสุดท้ายของ P2 และ P3
ข้างต้นเป็นสี่ตัวอย่างอิสระโดยไม่มีการเชื่อมต่อระหว่างพวกเขา
X หมายความว่า P3 ไม่ได้ใช้ฟังก์ชั่นหรือการจับดังนั้นจึงไม่มีวิธีจัดการกับความละเอียดหรือปฏิเสธ
ในที่สุดหากมีข้อผิดพลาดใด ๆ โปรดแก้ไขให้ฉันทันเวลาขอบคุณ! - - -
บทความข้างต้นความเข้าใจในเชิงลึกเกี่ยวกับโซ่ JS Promise เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น