การเขียนโปรแกรมแบบอะซิงโครนัสใน JavaScript ได้รับการยอมรับจากทุกคน ก่อนหน้านี้ผู้คนมักจะนำไปใช้ผ่านการทำรังการโทรกลับ setTimeout setInterval ฯลฯ รหัสดูไม่ใช้งานง่ายและยากที่จะเข้าใจอย่างรวดเร็วโดยไม่ต้องดูตรรกะรหัสทั้งหมด ฟังก์ชั่นแบบอะซิงโครนัสใน JavaScript รวมถึงฟังก์ชั่น I/O (AJAX, postmessage, โหลด IMG, โหลดสคริปต์ ฯลฯ ), ฟังก์ชั่นการกำหนดเวลา (settimeout, setInterval) ฯลฯ
เราทุกคนคุ้นเคยกับสิ่งเหล่านี้ ในแอพพลิเคชั่นที่ซับซ้อนมักจะมีการทำรังหลายชั้นและแม้กระทั่งคิดว่าบางขั้นตอนยังไม่เสร็จสมบูรณ์และมีข้อยกเว้นของโปรแกรม ตัวอย่างที่ง่ายที่สุดคือ: ตัวอย่างเช่นหากคุณฉีดโหนดลงใน DOM คุณต้องรอให้โหนดถูกฉีดและใช้งานโหนด เมื่อมีการฉีดโหนดจำนวนมากมันมักจะยากที่จะเข้าใจเวลา หากเรามีรหัสที่จะพึ่งพาข้อมูลของ API ของบุคคลที่สาม เราไม่สามารถเรียนรู้ว่าการตอบสนองของ API นั้นเป็นอย่างไรและส่วนอื่น ๆ ของแอปพลิเคชันอาจถูกบล็อกจนกว่าจะส่งคืนผลลัพธ์ สัญญาให้ทางออกที่ดีกว่าสำหรับปัญหานี้มันไม่ปิดกั้นและถูกแยกออกจากรหัสอย่างสมบูรณ์
ดังนั้นให้ฉันดูการเขียนโปรแกรมแบบอะซิงโครนัสใน JavaScript ก่อนอื่นฉันขอแนะนำให้คุณดูสัญญาที่ได้รับความนิยม/ข้อมูลจำเพาะ
สัญญา/ข้อมูลจำเพาะ
หมายเหตุ: เพื่อความสะดวกในการทำความเข้าใจคำอธิบายอาจแตกต่างจากสัญญา/ข้อกำหนด A;
คำสัญญาของ CommonJS/ข้อมูลจำเพาะทำให้การเขียนโปรแกรมแบบอะซิงโครนัสง่ายขึ้นโดยการสร้างมาตรฐานอินเตอร์เฟส API ทำให้รหัสตรรกะแบบอะซิงโครนัสของเราเข้าใจง่ายขึ้น
เราเรียกการดำเนินการตามสัญญา/ข้อกำหนด A วัตถุสัญญามีเพียงสามรัฐเท่านั้น: ไม่ได้ผลสำเร็จและล้มเหลว; มันถูกสร้างขึ้นในขั้นต้นด้วยสถานะที่ไม่ได้ผลและรัฐสามารถเปลี่ยนจากการไม่ได้ผลเป็นสำเร็จหรือไม่ได้ผลเป็นล้มเหลว (ล้มเหลว/ปฏิเสธ) เมื่อรัฐสำเร็จ (เสร็จสมบูรณ์) หรือล้มเหลว (ล้มเหลว/ปฏิเสธ) รัฐจะไม่สามารถเปลี่ยนแปลงได้อีก
คำสัญญา/ข้อกำหนดเป็นวิธีแก้ปัญหาเพื่ออธิบายแนวคิดของความล่าช้า (หรืออนาคต) ในโปรแกรม แนวคิดหลักคือไม่ดำเนินการวิธีการแล้วบล็อกแอปพลิเคชันและรอผลลัพธ์ที่จะกลับมาก่อนที่จะโทรกลับวิธีอื่น แต่เพื่อส่งคืนวัตถุสัญญาเพื่อตอบสนองการฟังในอนาคต ทั้งรัฐที่ปฏิบัติตามและสถานะที่ล้มเหลวสามารถรับฟังได้ สัญญาว่าจะลงทะเบียนการโทรกลับโดยใช้อินเทอร์เฟซจากนั้นเพื่อส่งคืนวัตถุสัญญา:
การคัดลอกรหัสมีดังนี้: จากนั้น (fulfilledhandler, orrorhandler, progresshandler);
จากนั้นอินเทอร์เฟซจะใช้เพื่อฟังสถานะที่แตกต่างกันของสัญญา FulfilleDhandler ใช้เพื่อรับฟังสถานะที่เติมเต็ม ErrorHandler ใช้เพื่อฟังสถานะที่ล้มเหลวและ ProgressHandler ใช้เพื่อฟังสถานะที่ไม่ได้ผล สัญญาไม่ได้บังคับให้ฟังเหตุการณ์ที่ไม่ได้ผล (ตัวอย่างเช่นเรารู้ว่า jQuery เวอร์ชันเก่า (1.5, 1.6) รอการตัดบัญชีเป็นการดำเนินการตามสัญญา แต่ไม่ได้ใช้การฟังของรัฐที่ไม่ได้ผล
เป็นที่เชื่อกันโดยทั่วไปว่าอินเตอร์เฟสนั้นส่งคืนวัตถุสัญญาใหม่ไม่ใช่วัตถุสัญญาดั้งเดิม วัตถุสัญญาใหม่ใหม่นี้สามารถเข้าใจได้ว่าเป็นมุมมองของวัตถุสัญญาดั้งเดิม มันมีชุดของวิธีการของวัตถุสัญญาดั้งเดิมเท่านั้น วิธีการเหล่านี้สามารถสังเกตสถานะของวัตถุสัญญาดั้งเดิมเท่านั้น แต่ไม่สามารถเปลี่ยนสถานะภายในของวัตถุรอการตัดบัญชีได้ สิ่งนี้สามารถหลีกเลี่ยงความขัดแย้งระหว่างผู้โทรหลายคนซึ่งสามารถเปลี่ยนสถานะของวัตถุสัญญาใหม่โดยไม่ส่งผลกระทบต่อผู้โทรรายอื่น
นอกจากนี้สัญญายังให้สองอินเทอร์เฟซที่ใช้การเปลี่ยนสถานะจากการแก้ไข (สถานะการใช้งานจากที่ยังไม่เสร็จจนถึงเสร็จสิ้น) และปฏิเสธ (สถานะการใช้งานจากที่ยังไม่เสร็จเพื่อปฏิเสธหรือล้มเหลว)
ส่งรูปภาพเพื่อช่วยให้เข้าใจ:
ด้วยคำสัญญาคุณสามารถเขียนตรรกะแบบอะซิงโครนัสด้วยความคิดแบบซิงโครนัส ในฟังก์ชั่นแบบอะซิงโครนัสคุณไม่สามารถใช้ลอง/จับเพื่อจับข้อยกเว้นและคุณไม่สามารถโยนข้อยกเว้นได้ ด้วยคำสัญญาเราสามารถกำหนดข้อผิดพลาดได้โดยตรงซึ่งเทียบเท่ากับการจับข้อยกเว้น
ต่อไปนี้เป็นไลบรารีชั้นเรียนหลายแห่งที่ทำตามคำสัญญา/ข้อกำหนดเมื่อ, เมื่อ, Q, rsvp.js, jQuery.deverred ฯลฯ