เมื่อใช้ jQuery ฉันรู้ว่าสัญญาเป็นโหมดของโหมดการเขียนโปรแกรม js assynchronous แต่ฉันไม่เข้าใจความแตกต่างระหว่างมันกับวัตถุรอการตัดบัญชีของ JQuery ในขณะที่โครงการของ บริษัท ดำเนินไปเราต้องรับข้อมูลจากแบ็กเอนด์ดังนั้นเราจึงตัดสินใจที่จะทำให้เสร็จ
สัญญา
สัญญาเป็นโหมดที่ดำเนินการเหตุการณ์แบบอะซิงโครนัสในรูปแบบของการดำเนินการแบบซิงโครนัสหลีกเลี่ยงเลเยอร์โดยเลเยอร์ของการทำรังและสามารถใช้งานเหตุการณ์แบบอะซิงโครนัสในโซ่
เรารู้ว่าเมื่อเขียนรหัสอะซิงโครนัสจาวาสคริปต์การโทรกลับเป็นกลไกที่ง่ายที่สุด แต่ถ้าคุณใช้กลไกนี้คุณต้องเสียสละการควบคุมการไหลการจัดการข้อยกเว้นและความหมายฟังก์ชั่นและแม้แต่ให้เราตกอยู่ในหลุมโทรกลับ
ใน ES6, AngularJs ในตัวในตัว Q ในสัญญา, AngularJs และเมื่อพวกเขาใช้สัญญา/ข้อมูลจำเพาะดังนี้:
แต่ละงานมีสามรัฐ: รอดำเนินการและล้มเหลว
1. สถานะการดำเนินการ: คุณสามารถเปลี่ยนเป็นสถานะการปฏิบัติตามหรือการปฏิเสธ
2. สถานะที่สมบูรณ์: ไม่สามารถเปลี่ยนเป็นรัฐอื่น ๆ ได้และรัฐไม่สามารถเปลี่ยนแปลงได้และจะต้องมีค่ามูลค่า
3. สถานะที่ถูกปฏิเสธ: ไม่สามารถเปลี่ยนเป็นรัฐอื่น ๆ และรัฐไม่สามารถเปลี่ยนแปลงได้จะต้องมีเหตุผล
การถ่ายโอนรัฐเป็นครั้งเดียว เมื่อรัฐสำเร็จ (เสร็จสมบูรณ์) หรือล้มเหลว (ล้มเหลว/ถูกปฏิเสธ) มันจะไม่สามารถเปลี่ยนแปลงได้อีก
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น oktogreet (ชื่อ) {
ส่งคืนชื่อ === 'Robin Hood';
-
ฟังก์ชัน asyncGreet (ชื่อ) {
var referred = $ q.defer ();
settimeout (function () {
// เนื่องจากฟังก์ชั่นแบบอะซิงโครนัส FN นี้ถูกดำเนินการในอนาคตแบบอะซิงโครนัสเราจึงห่อรหัสลงในการโทร $
$ scope. $ apple (function () {
deferred.notify ('เกี่ยวกับการทักทาย' + ชื่อ + '.');
if (oktogreet (ชื่อ)) {
deverred.resolve ('สวัสดี,' + ชื่อ + '!');
} อื่น {
ไม่อนุญาตให้ใช้งาน reject ('ทักทาย' + ชื่อ + 'ไม่อนุญาต');
-
-
}, 1,000);
return reterred.promise;
-
var pression = asyncGreet ('Robin Hood');
สัญญาแล้ว (ฟังก์ชั่น (คำทักทาย) {
การแจ้งเตือน ('ความสำเร็จ:' + ทักทาย);
}, ฟังก์ชัน (เหตุผล) {
การแจ้งเตือน ('ล้มเหลว:' + เหตุผล);
}, ฟังก์ชั่น (อัปเดต) {
การแจ้งเตือน ('ได้รับการแจ้งเตือน:' + อัปเดต);
-
การใช้งานขั้นพื้นฐานของ Q Promise
รหัสข้างต้นแสดงบทบาทของวิธีการหลายวิธีของอินสแตนซ์ deffered ที่สร้างโดย $ q.defer () หากการดำเนินการแบบอะซิงโครนัสประสบความสำเร็จสถานะของวัตถุสัญญาจะเปลี่ยนเป็น "ความสำเร็จ" (เช่นจากรอการแก้ไข); หากการดำเนินการแบบอะซิงโครนัสล้มเหลวสถานะจะถูกเปลี่ยนเป็น "ล้มเหลว" (เช่นจากรอการปฏิเสธ) ในที่สุด return reterred.promise และเราสามารถเรียกใช้วิธีการนี้
JS จะมีคำสัญญาดั้งเดิมมีวัตถุสัญญาอยู่แล้วใน ES6 และ API สัญญาพื้นฐานถูกนำไปใช้ใน Firefox และ Chrome 32 รุ่นเบต้า
$ q.defferd ใน Angularjs
ส่งคืนวัตถุ deffered ที่จะเรียกว่าถูกล่ามโซ่โดยโทรไปที่ $ q.defferd วัตถุนี้เชื่อมโยงสถานะงานทั้งสามในสัญญา/ข้อกำหนด A ผ่าน API
API deffered
วิธีการของวัตถุ deffered
1. Resolve (ค่า): ที่การแก้ไขการประกาศ () มันบ่งชี้ว่าวัตถุสัญญาเปลี่ยนจากสถานะที่รอดำเนินการเพื่อแก้ไข
2. การปฏิเสธ (เหตุผล): ที่การแก้ไขการประกาศ () มันบ่งชี้ว่าวัตถุสัญญาเปลี่ยนจากสถานะที่รอดำเนินการเป็นปฏิเสธ
3.Notify (ค่า): ที่ประกาศการประกาศ () แสดงว่าสถานะที่ไม่ได้ผลของวัตถุสัญญาสามารถเรียกได้หลายครั้งก่อนที่จะแก้ไขหรือปฏิเสธ
คุณสมบัติวัตถุที่ถูกตัดออก
คำสัญญา: สิ่งสุดท้ายที่ส่งคืนเป็นคุณสมบัติของวัตถุที่รอการตัดบัญชีใหม่ไม่ใช่วัตถุรอการตัดบัญชีดั้งเดิม วัตถุสัญญาใหม่นี้สามารถสังเกตสถานะของวัตถุสัญญาดั้งเดิมเท่านั้นและไม่สามารถแก้ไขสถานะภายในของวัตถุรอการตัดบัญชีซึ่งสามารถป้องกันไม่ให้สถานะงานถูกแก้ไขภายนอก
สัญญา API
เมื่อสร้างอินสแตนซ์ที่รอการตัดบัญชีวัตถุสัญญาใหม่จะถูกสร้างขึ้นและการอ้างอิงสามารถรับได้ผ่านการเลื่อนออกไป
วัตถุประสงค์ของวัตถุสัญญาคือเพื่อให้ส่วนที่สนใจได้รับผลการดำเนินการเมื่องานรอการตัดบัญชีเสร็จสิ้น
วิธีการของวัตถุสัญญา
1. จากนั้น (errorhandler, femonthilledhandler, progresshandler): วิธีนี้ใช้ในการฟังสถานะที่แตกต่างกันของสัญญา Error Handler รับฟังสถานะที่ล้มเหลว, FoundilledHandler รับฟังสถานะที่สมบูรณ์และ ProgressHandler รับฟังสถานะที่ไม่ได้ผล นอกจากนี้การแจ้งเตือนการแจ้งเตือนอาจถูกเรียก 0 ถึงหลายครั้งโดยให้ข้อบ่งชี้ความคืบหน้าก่อนที่จะแก้ไขหรือปฏิเสธ (การแก้ไขและปฏิเสธ)
2.Catch (ErrorCallback) - ทางลัดเป็นสัญญาจากนั้น (NULL, ERRORCALLBACK)
3. ในที่สุด (การโทรกลับ) - ช่วยให้คุณสังเกตได้ว่าสัญญาจะถูกดำเนินการหรือปฏิเสธ แต่คุณไม่จำเป็นต้องแก้ไขค่าสุดท้าย สิ่งนี้สามารถใช้ในการใช้ทรัพยากรฟรีหรือทำความสะอาดวัตถุที่ไร้ประโยชน์ไม่ว่าสัญญาจะถูกปฏิเสธหรือแก้ไข สำหรับข้อมูลเพิ่มเติมโปรดดูข้อมูลจำเพาะเอกสารฉบับเต็ม
การเรียกห่วงโซ่สัญญาสามารถนำไปใช้ผ่านวิธีการ ()
การคัดลอกรหัสมีดังนี้:
PromitionB = Promisea.Then (ฟังก์ชั่น (ผลลัพธ์) {
ส่งคืนผลลัพธ์ + 1;
-
// PromiseB จะดำเนินการทันทีหลังจากดำเนินการตามสัญญา
// และมูลค่าของมันเป็นผลมาจากสัญญาเพิ่มขึ้น 1
วิธีอื่น ๆ ของ $ q
$ Q. เมื่อ (ค่า): ผ่านค่าตัวแปร, promise. จากนั้น () ดำเนินการโทรกลับที่ประสบความสำเร็จ
$ Q.ALL (สัญญา): ต้องดำเนินการตามสัญญาหลายครั้งสำเร็จก่อนที่พวกเขาจะสามารถดำเนินการได้สำเร็จ ค่าจะถูกส่งผ่านเป็นอาร์เรย์หรือค่าแฮช แต่ละค่าในอาร์เรย์เป็นวัตถุสัญญาที่สอดคล้องกับดัชนี