1.1 ฟังก์ชั่นการโทรกลับ
ฟังก์ชั่นการโทรกลับ: ส่งผ่านฟังก์ชัน A เป็นพารามิเตอร์เพื่อเรียกใช้ฟังก์ชัน B อื่น จากนั้น A คือฟังก์ชันโทรกลับ [แนะนำ: วิดีโอสอน JavaScript]
ตัวอย่างบางส่วนชื่อการโทรกลับ
function คุณมีสุนัขกี่ตัว(fn){ fn('สุนัข') }ฟังก์ชันนับสุนัข(หมายเลข){ console.log(ปริมาณ) - มีหมากี่ตัว (นับหมา) // หมาหนึ่งตัว
โทรกลับโดยไม่ระบุชื่อ
function คุณมีสุนัขกี่ตัว(fn){ fn('สุนัข') - คุณมีสุนัขกี่ตัว (function(number){console.log(number) }) // สุนัข
ตัวอย่างทั่วไป
ฟังก์ชั่นการโทรกลับถูกใช้ใน jQuery และใช้การโทรกลับแบบไม่ระบุชื่อที่นี่
$("#btn").คลิก(ฟังก์ชั่น(){ console.log('คลิกที่ฉัน') -
1.2 Callback Hell (ข้อเสียของการโทรกลับ 1)
Callback Hell: หมายถึงสถานการณ์ที่มีการซ้อน Callback มากเกินไป ทำให้โค้ดเข้าใจยาก
ให้ข้อมูล = []ฟังก์ชั่น คุณมีสุนัขกี่ตัว (fn){ fn('สุนัข') }function คุณมีแมวกี่ตัว(fn){ fn('แมว') }ฟังก์ชันรู้ (ปริมาณ, โทรกลับ){ info.push (ปริมาณ) console.log (ข้อมูล) ถ้า (โทรกลับ) { โทรกลับ() - }//เริ่มการโทร หากมีเลเยอร์มากกว่านี้ 2-3 ชั้น จะเป็นการยากที่จะเข้าใจว่าคุณมีสุนัขกี่ตัว (ฟังก์ชั่น(จำนวนสุนัข){ console.log(จำนวนสุนัข) เข้าใจแล้ว(จำนวนสุนัข, function(){ คุณมีแมวกี่ตัว(ฟังก์ชั่น(จำนวนแมว){ console.log(จำนวนแมว) ได้เลย (จำนวนแมว) - - -
1.3 วิธีแก้ปัญหาโดยไม่ใช้ Promise
ใช้ฟังก์ชันที่มีชื่อแทนฟังก์ชันที่ไม่ระบุชื่อ
ให้ข้อมูล = []ฟังก์ชั่น คุณมีสุนัขกี่ตัว (fn){ fn('สุนัข') }function คุณมีแมวกี่ตัว(fn){ fn('แมว') }ฟังก์ชันรู้ (ปริมาณ, โทรกลับ){ info.push (ปริมาณ) console.log (ข้อมูล) ถ้า (โทรกลับ) { โทรกลับ() - }ฟังก์ชั่นบอกจำนวนแมว (จำนวนแมว){ console.log(จำนวนแมว) ได้เลย (จำนวนแมว) }ฟังก์ชันนับต่อไป(){ คุณมีแมวกี่ตัว (บอกจำนวนแมว) }ฟังก์ชั่นบอกจำนวนสุนัข (จำนวนสุนัข){ console.log(จำนวนสุนัข) ได้เลย (จำนวนหมานับเรื่อยๆ) - มีหมากี่ตัว (บอกจำนวนหมาด้วย) // ดูเหมือนจะไม่ดีขึ้นเท่าไหร่ - -
1.4 วิธีการโทรกลับแตกต่างกันและต้องจำแยกกัน (ข้อเสียในการโทรกลับ 2)
readFile ('C:\1.txt', ฟังก์ชั่น (ข้อผิดพลาด, ข้อมูล) { // โทรกลับใน node.js อ่านวิธีไฟล์ถ้า (ข้อผิดพลาด) { console.log('ความสำเร็จ') console.log(data.toString()) } อื่น { console.log('ไม่สามารถอ่านไฟล์ได้') - - $.ajax({ //Callback url:'/2.txt' ในวิธี ajax ใน jQuery ความสำเร็จ: ฟังก์ชั่น (ตอบสนอง) { console.log('ความสำเร็จ') - ข้อผิดพลาด: ฟังก์ชั่น () { console.log('ล้มเหลว') - -
Promises เป็นโซลูชันสำหรับการเขียนโปรแกรมแบบอะซิงโครนัสที่สมเหตุสมผลและมีประสิทธิภาพมากกว่าโซลูชันแบบเดิม - การเรียกกลับและเหตุการณ์ ได้รับการเสนอและนำไปใช้ครั้งแรกโดยชุมชน ES6 เขียนลงในมาตรฐานภาษา รวมการใช้งาน และจัดเตรียมออบเจ็กต์ Promise
3.1 หลักการปฏิบัติ
ES6 กำหนดว่าวัตถุ Promise เป็นตัวสร้างที่ใช้ในการสร้างอินสแตนซ์ Promise ด้วยการส่งคืนอินสแตนซ์ของวัตถุ Promise ภายในฟังก์ชัน คุณจะสามารถใช้คุณสมบัติและวิธีการของ Promise สำหรับขั้นตอนต่อไปได้
ฟังก์ชั่น ชื่อฟังก์ชั่น () { คืนสัญญาใหม่ (ฟังก์ชั่น (แก้ไข, ปฏิเสธ) { // ... โค้ดบางส่วนถ้า (/* การดำเนินการแบบอะซิงโครนัสสำเร็จ */){ แก้ไข (ค่า); // ถูกเรียกเมื่อการดำเนินการแบบอะซิงโครนัสสำเร็จและส่งผลลัพธ์เป็นพารามิเตอร์ } else { ปฏิเสธ (ข้อผิดพลาด); // ถูกเรียกเมื่อเกิดความล้มเหลวแบบอะซิงโครนัส โดยส่งข้อผิดพลาดเป็นพารามิเตอร์ } - -
3.2 ตรรกะการโทร
ทั้ง S1 และ E1 ไม่ได้รายงานข้อผิดพลาด ดำเนินการ S2 (แก้ไขการดำเนินการ ระบบคิดว่าเสร็จสิ้นแล้ว และไม่มีการรายงานข้อผิดพลาด)
หาก S1 หรือ E1 รายงานข้อผิดพลาด ให้ดำเนินการ E2 (ปฏิเสธการดำเนินการ ระบบคิดว่ายังไม่เสร็จสิ้น และรายงานข้อผิดพลาด)
การเข้าสู่ Front-end (vue) สู่หลักสูตรการเรียนรู้: เข้าสู่การเรียนรู้
4.1 คุณสมบัติและวิธีการของสัญญา
คุณสมบัติ
Promise.prototype แสดงถึงวิธีการต้นแบบของตัวสร้าง Promise
สัญญา.prototype.แล้ว()
กลับสัญญา. ต้องมีพารามิเตอร์ไม่เกินสองตัว: ฟังก์ชันการเรียกกลับความสำเร็จและความล้มเหลวของ Promise
สัญญา.prototype.catch()
คืนคำสัญญาและจัดการกับการปฏิเสธ เทียบเท่ากับ Promise.prototype.then (ไม่ได้กำหนด, onRejected)
สัญญา.prototype.finally()
ในที่สุด () วิธีการส่งคืนสัญญา หลังจากดำเนินการแล้ว () และ catch () ฟังก์ชันการโทรกลับที่ระบุโดยในที่สุดจะถูกดำเนินการ หลีกเลี่ยงสถานการณ์ที่ต้องเขียนคำสั่งเดียวกันครั้งเดียวใน then() และ catch()
Promise.all (ทำซ้ำได้)
ส่งคืนอินสแตนซ์ Promise หลังจากที่สัญญาทั้งหมดในพารามิเตอร์ที่ทำซ้ำได้ได้รับการแก้ไขแล้ว การโทรกลับจะเสร็จสิ้นการแก้ไข
Promise.race (ทำซ้ำได้)
ส่งกลับสัญญา พร้อมด้วยค่าตอบแทนของวัตถุสัญญาหรือเหตุผลข้อผิดพลาดในการปฏิเสธ ตราบใดที่มีวัตถุสัญญาในการวนซ้ำที่ "แก้ไข" หรือ "ปฏิเสธ"
สัญญาแก้ไข()
ส่งกลับวัตถุ Promise ที่แก้ไขด้วยค่าที่กำหนด แต่ถ้าค่านี้เป็นค่านั้น (นั่นคือ ด้วยเมธอด then) สัญญาที่ส่งคืนจะ "ติดตาม" อ็อบเจ็กต์นั้นและนำสถานะสุดท้ายมาใช้ (หมายถึงแก้ไขแล้ว/ปฏิเสธ/รอดำเนินการ/ชำระบัญชี) หากค่าที่เข้ามานั้นเอง วัตถุสัญญา จากนั้นวัตถุจะถูกส่งกลับเป็นค่าที่ส่งคืนของเมธอด Promise.resolve มิฉะนั้น วัตถุสัญญาจะถูกส่งกลับพร้อมค่านี้เป็นสถานะความสำเร็จ
สัญญา.ปฏิเสธ()
ส่งกลับออบเจ็กต์ Promise พร้อมด้วยพารามิเตอร์เหตุผลสำหรับการปฏิเสธ
4.2 เขียนตัวอย่างใหม่ใน callback hell ลงในแบบฟอร์ม Promise
คุณจะเห็นว่าหลังจากใช้ Promise แล้ว ตรรกะจะใช้งานง่ายและเขียนได้สมบูรณ์ยิ่งขึ้น
เมื่อ Promise ซ้อนอยู่ใน Promise นั่นคือเมื่อ Promise ถูกโยง - ให้ใส่ใจกับความล้มเหลวของการส่งข้อมูล เมื่อเราใช้ Promise chain หากแต่ละขั้นตอนต้องการข้อมูลจากขั้นตอนก่อนหน้า พารามิเตอร์จะต้องผ่านการแก้ไขสำเร็จ . พารามิเตอร์ หากล้มเหลว ให้ส่งผ่านพารามิเตอร์ผ่านการปฏิเสธ หากคุณลืมส่งพารามิเตอร์ คุณจะไม่ได้ผลลัพธ์ที่ต้องการ
แก้ไขจะส่งคืนข้อมูลที่สำเร็จไปยังการโทรกลับครั้งถัดไป
ปฏิเสธการส่งคืนข้อมูลที่ล้มเหลวไปยังการโทรกลับครั้งถัดไป
ส่งพารามิเตอร์เพื่อแก้ไขที่นี่และเปลี่ยนเป็นตัวอย่างของความล้มเหลว ห้ามส่งพารามิเตอร์เพื่อปฏิเสธก่อน หากล้มเหลว การโทรกลับครั้งถัดไปจะไม่ได้รับข้อมูล
ส่งพารามิเตอร์ที่จะปฏิเสธ
เราจะเห็นได้ว่าแม้ว่าจะผ่านการเรียกกลับที่ล้มเหลว แต่การเรียกกลับที่สำเร็จครั้งถัดไปจะยังคงดำเนินการอยู่ เนื่องจากไม่ทราบ () ส่งคืนโดยไม่ได้กำหนดไว้ตามค่าเริ่มต้น จึงเทียบเท่ากับความล้มเหลวที่ได้รับการประมวลผล เมื่อประมวลผลทั้งสำเร็จและล้มเหลว การโทรกลับครั้งต่อไปจะถูกนำมาใช้
เปลี่ยนเป็นสิ่งที่คาดหวังคือจะไม่ถูกเรียกหากล้มเหลว
แบบย่อ การไม่เรียกความล้มเหลว
หลังจากดำเนินการตามสถานการณ์ข้างต้นแล้ว การโทรกลับที่สำเร็จใน .then (ยกเว้นสุนัข) จะไม่ถูกดำเนินการ ลองเพิ่มการโทรกลับที่ล้มเหลวเพื่อดู
คุณยังสามารถคืนการแก้ไขเพื่อให้สามารถดำเนินการโทรกลับที่สำเร็จในภายหลังได้
4.3 การสมัคร
การโหลดรูปภาพจะเขียนการโหลดรูปภาพเป็นสัญญา เมื่อการโหลดเสร็จสิ้น สถานะของสัญญาจะเปลี่ยนไป
const preloadImage = ฟังก์ชั่น (เส้นทาง) { คืนสัญญาใหม่ (ฟังก์ชั่น (แก้ไข, ปฏิเสธ) { const image = รูปภาพใหม่ (); image.onload = แก้ไข; image.onerror = ปฏิเสธ; image.src = เส้นทาง; - -
การรวมกันของฟังก์ชัน Generator และ Promise (สำหรับรายละเอียด ดูลิงก์อ้างอิง บทช่วยสอนของ Ruan Yifeng)
5.1 รอครับ
กรณีที่ประสบความสำเร็จ
ใช้ try catch ในกรณีที่เกิดความล้มเหลว
ใช้ await กับ try catch ซึ่งจะสมบูรณ์กว่า
วัตถุสัญญาสามารถใช้เพื่อเปลี่ยนฟังก์ชั่นธรรมดาเป็นรูปแบบการคืนสัญญาเพื่อแก้ปัญหานรกเรียกกลับ
ทำความเข้าใจตรรกะการเรียกความสำเร็จและความล้มเหลวของ Promise และสามารถปรับได้อย่างยืดหยุ่น
ทำความเข้าใจความรู้หลัก ใช้ก่อน แล้วค่อยๆ บูรณาการและซึมซับความรู้
ข้างต้นเป็นเนื้อหาโดยละเอียดของการวิเคราะห์ตัวอย่างหลักการและการใช้ ES6 Promise!