แก้ว่าฟังก์ชั่นการโทรกลับนั้นลึกเกินไปและตรรกะแบบขนานจะต้องดำเนินการตามลำดับ สัญญาแสดงถึงผลลัพธ์สุดท้ายของการดำเนินการแบบอะซิงโครนัส วิธีหลักในการโต้ตอบกับสัญญาคือการลงทะเบียนฟังก์ชั่นการโทรกลับผ่านวิธีการ () () เพื่อรับค่าผลลัพธ์สุดท้ายของสัญญา
โปรโตคอลที่เกี่ยวข้องกับสัญญารวมถึง Promisea และ Promisea+
กำหนดสัญญาชั้นเรียน
กำหนดคิวคิวแอตทริบิวต์เริ่มต้นอาร์เรย์ที่ว่างเปล่า []
กำหนดค่าค่าคุณสมบัติเริ่มต้น null
กำหนดสถานะสถานะของคุณสมบัติและเริ่มต้น "รอดำเนินการ" (ค่าเริ่มต้น)
กำหนดวิธีการสมาชิก getqueue (), return attribute queue
กำหนดวิธีการสมาชิก getStatus (), ส่งคืนสถานะแอตทริบิวต์
กำหนดวิธีการสมาชิก setStatus (), สถานะ, พารามิเตอร์การส่งผ่าน: สถานะ, ค่า
กำหนดว่าสถานะเป็นจริงหรือถูกปฏิเสธ
ตั้งค่าคุณสมบัติสถานะ this.status = สถานะ
ตั้งค่าคุณสมบัติ Value this.value = value || null ถ้าคุณไม่ผ่านค่ามันเป็นโมฆะ
กำหนด freezeobject ตัวแปร freeze
กำหนดวิธีการสมาชิก IsFulfilled () เพื่อตรวจสอบว่าสถานะปัจจุบัน (เสร็จสมบูรณ์)
กำหนดวิธีการสมาชิก isrejected () เพื่อตรวจสอบว่าสถานะปัจจุบัน (ล้มเหลว)
กำหนดวิธีการสมาชิก iSpending () กำหนดสถานะปัจจุบันหลักคือ (รอ)
กำหนดวิธีการสมาชิกจากนั้น (), พารามิเตอร์ผ่าน: การโทรกลับที่ประสบความสำเร็จ onfulliled, onrejected ล้มเหลวในการโทรกลับ
กำหนดฟังก์ชั่นการโทรกลับสองฟังก์
กำหนดคุณสมบัติรอการตัดบัญชีของวัตถุตัวจัดการวัตถุรอการตัดบัญชี
ตรวจสอบว่าสถานะปัจจุบันกำลังรอ หากกำลังรอให้ใส่วัตถุตัวจัดการลงในอาร์เรย์คิวคิว
หากไม่ใช่สถานะรอให้เรียกใช้วิธีการ () วิธีการของวัตถุ UTILS พารามิเตอร์: สถานะ
return handler.deverred.promise Object
กำหนดคลาสรอการตัดบัญชี
กำหนดสัญญาแอตทริบิวต์และเริ่มต้นวัตถุสัญญา
กำหนดวิธีการสมาชิกแก้ไข (), ผ่านพารามิเตอร์: ผลลัพธ์ผลลัพธ์
กำหนดสถานะของวัตถุสัญญาเป็นการรอและส่งคืนโดยตรง
เรียกวิธีการ getqueue () ของวัตถุสัญญาเพื่อรับอาร์เรย์คิว
อาร์เรย์วน
// TODO เรียกใช้คลาสเครื่องมือ โพรซีเดอร์ () เมธอดพารามิเตอร์: "เติมเต็ม", องค์ประกอบ, ข้อมูลผิดพลาด
เรียกเมธอด setStatus () ของวัตถุสัญญาตั้งค่าสถานะพารามิเตอร์: 'เติมเต็ม' ผลลัพธ์ผลลัพธ์
กำหนดวิธีการสมาชิกปฏิเสธพารามิเตอร์การส่ง: ข้อความแสดงข้อผิดพลาดผิดพลาด
กำหนดสถานะของวัตถุสัญญาเป็นการรอและส่งคืนโดยตรง
เรียกวิธีการ getqueue () ของวัตถุสัญญาเพื่อรับอาร์เรย์คิว
อาร์เรย์วน
// TODO โทรไปที่คลาสเครื่องมือ โพรซีเดอร์ () เมธอดพารามิเตอร์: "ปฏิเสธ", องค์ประกอบ, ข้อมูลผิดพลาดข้อมูล
เรียกเมธอด setStatus () ของวัตถุสัญญาตั้งค่าสถานะพารามิเตอร์: 'เติมเต็ม' ผลลัพธ์ผลลัพธ์
กำหนดคลาสเครื่องมือใช้งานดำเนินการทันทีโดยใช้ฟังก์ชั่นที่ไม่ระบุชื่อและรับวัตถุ
ส่งคืนวัตถุมีวิธีการวิธีการ () ในวัตถุ
กำหนดวิธีการขั้นตอน (), พารามิเตอร์การส่งผ่าน: ประเภทสถานะสถานะ, อาร์เรย์โปรเซสเซอร์ตัวจัดการ, ผลลัพธ์ผลลัพธ์
รับฟังก์ชั่นการประมวลผล func ในตัวจัดการ [ประเภท]
ฉันเวียนหัวเมื่อฉันมาถึงที่นี่ - -
วิธีใช้:
กำหนดฟังก์ชัน AJAX ผ่านพารามิเตอร์: เส้นทาง URL
รับวัตถุรอการตัดบัญชีและออกมาใหม่
รหัสของ Ajax เพื่อขอข้อมูลในวิธีการโทรกลับที่ส่งคืนข้อมูล
หากเรียกใช้วิธีการแก้ไข () ของวัตถุที่รอการตัดบัญชีได้สำเร็จพารามิเตอร์: ส่งคืนข้อมูล
หากวิธีการปฏิเสธ () ของวัตถุรอการตัดบัญชีเรียกว่าล้มเหลวพารามิเตอร์: ข้อมูลที่ส่งคืน
ส่งคืนวัตถุรอการตัดบัญชี
โทรหาวิธี Ajax () เพื่อรับวัตถุสัญญาพารามิเตอร์: URL
เรียกใช้วิธีการ () ของวัตถุสัญญาพารามิเตอร์: ฟังก์ชันที่ไม่ระบุชื่อ
เรียกเมธอด ajax () เพื่อรับวัตถุสัญญาและส่งคืนวัตถุนี้
สร้างสายโซ่
JS Part:
<script> // ส่วนรหัสสัญญา (ฉันเลือกเข็มขัดสุนัข) สัญญา = function () {this.queue = []; this.value = null; this.status = 'รอดำเนินการ'; // รอการตอบสนองที่ถูกปฏิเสธ}; promise.prototype.getqueue = function () {return this.queue;}; promise.prototype.getStatus = function () {return.status;}; 'ปฏิเสธ') {this.status = s; this.value = value || โมฆะ; this.queue = []; var freezeObject = object.feeze || การทำงาน(){}; freezeObject (นี่); // สถานะของสัญญาไม่สามารถย้อนกลับได้} อื่น {โยนข้อผิดพลาดใหม่ ({ข้อความ: "ไม่สนับสนุนสถานะ:" + s}); }}; Promise.prototype.isfulfilled = function () {return this.status === 'fulfilled';}; promit.prototype.isrejected = function () {return this.status === 'ปฏิเสธ' ฟังก์ชั่น (onfulfilled, onrejected) {var handler = {'เติมเต็ม': onfulfilled, 'ปฏิเสธ': onrejected}; handler.deverred = new referred (); if (! this.ispending ()) {// สิ่งนี้ได้รับอนุญาตให้เปลี่ยนสถานะสัญญาก่อนจากนั้นเพิ่ม utils.procedure (this.status, handler, this.value); } else {this.queue.push (handler); // จากนั้นอาจเรียกได้หลายครั้งในสัญญาเดียวกัน; ข้อมูลจำเพาะ 2.2.6} return handler.deferred.promise; // จากนั้นจะต้องส่งคืนสัญญา; ข้อมูลจำเพาะ 2.2.7}; var utils = (ฟังก์ชัน) }; newresult. แล้ว (data) {// def.resolve (data); //}, ฟังก์ชั่น (err) {// def.reject (err); //}); // ถ้า/เมื่อ x ปฏิบัติตามสัญญาด้วยค่าเดียวกัน การเปลี่ยนผ่าน (def, 'rejected', err); {โยนข้อผิดพลาดใหม่ ({'ข้อความ': "ไม่สนับสนุนประเภท:" + type});}}; } var queue = this.promise.getqueue (); สำหรับ (var i = 0, len = queue.length; i <len; i ++) {utils.procedure ('เติมเต็ม', คิว [i], ผลลัพธ์); } this.promise.setStatus ('เติมเต็ม', ผลลัพธ์);}; deverred.prototype.reject = function (err) {ถ้า (! this.promise.ispending ()) {return; } var queue = this.promise.getqueue (); สำหรับ (var i = 0, len = queue.length; i <len; i ++) {utils.procedure ('ปฏิเสธ', คิว [i], err); } this.promise.setstatus ('ปฏิเสธ', err);}/********************************************************************************************* var xhr = ใหม่ xmlhttprequest (); xhr.onreadyStateChange = function () {ถ้า (xhr.readystate === 4) {ถ้า ((xhr.status> = 200 && xhr.status <300) || xhr.status === 304) {def.resolve (xhr.responsetext) ข้อผิดพลาด ({ข้อความ: xhr.status})); - xhr.open ('get', url, true); XHR.Send (NULL); return def.promise;} ajax ('test.php? act = 1') จากนั้น (ฟังก์ชั่น (data1) {console.log (data1); // จัดการ data1 ส่งคืน ajax ('test.php? act = 2');}) {console.error (err);}). จากนั้น (ฟังก์ชั่น (data3) {console.log (data3); แจ้งเตือน ('ความสำเร็จ');}, ฟังก์ชัน (err) {console.error (err);}); </script>PHP:
<? phpif ($ _ get ['act'] == 1) {echo json_encode (อาร์เรย์ ("รหัส" => 200));} ถ้า ($ _ get ['act'] == 2) {echo json_encode (array ("code" => 300); JSON_ENCODE (อาร์เรย์ ("รหัส" => 400));}บทสรุปข้างต้นของการเรียนรู้ที่เรียบง่ายและการใช้คำสัญญา JavaScript คือเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น