ใช่คำสัญญาเป็นการเรียกกลับแบบอะซิงโครนัส พวกเขาไม่สามารถทำสิ่งใด ๆ ที่การเรียกกลับไม่สามารถทำได้และคุณประสบปัญหาเดียวกันกับอะซิงโครนัสเช่นเดียวกับการโทรกลับธรรมดา
อย่างไรก็ตามสัญญามีมากขึ้นกว่าเพียงแค่การเรียกกลับ พวกมันเป็นสิ่งที่เป็นนามธรรมอย่างยิ่งช่วยให้โค้ดที่สะอาดและดีกว่าทำงานได้ดีขึ้น
ดังนั้นแนวคิดหลักคืออะไร
สัญญาเป็นวัตถุที่แสดงผลลัพธ์ของการคำนวณเดียว (แบบอะซิงโครนัส) พวกเขาแก้ไขผลลัพธ์นั้นเพียงครั้งเดียว มีบางสิ่งที่ความหมายนี้คือ:
สัญญาใช้รูปแบบการสังเกตการณ์:
- คุณไม่จำเป็นต้องรู้การเรียกกลับที่จะใช้ค่าก่อนที่งานจะเสร็จสมบูรณ์
- แทนที่จะคาดหวังว่าการเรียกกลับเป็นอาร์กิวเมนต์สำหรับฟังก์ชั่นของคุณคุณสามารถ
return
เป็นวัตถุสัญญาได้อย่างง่ายดาย
- สัญญาจะเก็บค่าและคุณสามารถโปร่งใสเพิ่มโทรกลับเมื่อใดก็ตามที่คุณต้องการ มันจะถูกเรียกเมื่อผลลัพธ์ที่มีอยู่ "ความโปร่งใส" หมายความว่าเมื่อคุณมีสัญญาและเพิ่มการติดต่อกลับมันไม่ได้สร้างความแตกต่างให้กับรหัสของคุณไม่ว่าผลลัพธ์จะมาถึงก็ตาม - API และสัญญาต่าง ๆ นั้นมีความเหมือนกัน
- คุณสามารถเพิ่มการโทรกลับหลายรายการได้อย่างง่ายดาย
สัญญามี chainable ( เอก , ถ้าคุณต้องการ ):
- หากคุณต้องการแปลงค่าที่สัญญาแสดงไว้คุณจะแมปฟังก์ชันการแปลงเหนือสัญญาและรับสัญญาใหม่ที่แสดงผลลัพธ์ที่แปลงแล้ว คุณไม่สามารถรับค่าที่จะใช้พร้อมกันได้ แต่คุณสามารถยกระดับการเปลี่ยนแปลงในบริบทของสัญญาได้อย่างง่ายดาย ไม่มีการโทรกลับสำเร็จรูป
- หากคุณต้องการเชื่อมโยงสองภารกิจอะซิงโครนัสคุณสามารถใช้
.then()
วิธีการนี้ได้ มันจะใช้การเรียกกลับที่จะเรียกด้วยผลแรกและส่งกลับสัญญาสำหรับผลของสัญญาที่โทรกลับกลับมา
ฟังดูซับซ้อนไหม? เวลาสำหรับตัวอย่างรหัส
var p1 = api1(); // returning a promise
var p3 = p1.then(function(api1Result) {
var p2 = api2(); // returning a promise
return p2; // The result of p2 …
}); // … becomes the result of p3
// So it does not make a difference whether you write
api1().then(function(api1Result) {
return api2().then(console.log)
})
// or the flattened version
api1().then(function(api1Result) {
return api2();
}).then(console.log)
ความเรียบไม่ได้มาอย่างน่าอัศจรรย์ แต่คุณสามารถทำได้อย่างง่ายดาย สำหรับตัวอย่างที่ซ้อนกันอย่างมากของคุณค่าเทียบเท่า (ใกล้) จะเป็น
api1().then(api2).then(api3).then(/* do-work-callback */);
หากเห็นรหัสของวิธีการเหล่านี้จะช่วยให้ความเข้าใจที่นี่เป็นส่วนใหญ่ lib สัญญาขั้นพื้นฐานในไม่กี่บรรทัด
เอะอะใหญ่เกี่ยวกับสัญญาคืออะไร?
คำสัญญาที่เป็นนามธรรมช่วยให้การจัดองค์ประกอบฟังก์ชั่นดีขึ้นมาก ตัวอย่างเช่นถัดจากthen
การผูกมัดall
ฟังก์ชันสร้างสัญญาสำหรับผลลัพธ์ที่รวมกันของสัญญาที่รอแบบขนานหลายรายการ
สุดท้าย แต่ไม่ท้ายสุดสัญญามาพร้อมกับการจัดการข้อผิดพลาดแบบรวม ผลของการคำนวณอาจเป็นได้ว่าคำสัญญานั้นได้รับการเติมคุณค่าหรือถูกปฏิเสธด้วยเหตุผล ฟังก์ชันการจัดองค์ประกอบทั้งหมดจะจัดการสิ่งนี้โดยอัตโนมัติและเผยแพร่ข้อผิดพลาดในกลุ่มสัญญาเพื่อที่คุณจะได้ไม่ต้องสนใจมันอย่างชัดเจนทุกที่ - ตรงกันข้ามกับการใช้งานการติดต่อกลับแบบธรรมดา ในท้ายที่สุดคุณสามารถเพิ่มการเรียกกลับข้อผิดพลาดเฉพาะสำหรับข้อยกเว้นที่เกิดขึ้นทั้งหมด
ไม่ต้องพูดถึงต้องเปลี่ยนสิ่งต่าง ๆ เพื่อสัญญา
นั่นเป็นเรื่องเล็กน้อยที่จริงแล้วมีห้องสมุดสัญญาที่ดีดูฉันจะแปลง callback API ที่มีอยู่เป็นสัญญาได้อย่างไร