ปัญหาเดียวของสัญญาคือ IE ไม่รองรับพวกเขา Edge ทำ แต่มี IE 10 และ 11 มากมาย: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise (ความเข้ากันได้ที่ด้านล่าง)
ดังนั้น JavaScript จึงเป็นเธรดเดียว หากคุณไม่ได้ทำการโทรแบบอะซิงโครนัสมันจะทำงานตามที่คาดการณ์ไว้ เธรด JavaScript หลักจะเรียกใช้ฟังก์ชันหนึ่งอย่างสมบูรณ์ก่อนที่จะเรียกใช้งานฟังก์ชันถัดไปตามลำดับที่ปรากฏในรหัส ลำดับการรับประกันสำหรับฟังก์ชั่นซิงโครนัสเป็นเรื่องเล็กน้อย - แต่ละฟังก์ชั่นจะดำเนินการอย่างสมบูรณ์ตามลำดับที่ถูกเรียก
คิดว่าการทำงานของซิงโครเป็นหน่วยงานอะตอม เธรด JavaScript หลักจะดำเนินการอย่างสมบูรณ์ตามลำดับคำสั่งที่ปรากฏในรหัส
แต่ให้โทรแบบอะซิงโครนัสเหมือนในสถานการณ์ต่อไปนี้:
showLoadingDiv(); // function 1
makeAjaxCall(); // function 2 - contains async ajax call
hideLoadingDiv(); // function 3
นี้ไม่ได้ทำในสิ่งที่คุณต้องการ มันจะเรียกใช้งานฟังก์ชั่น 1, ฟังก์ชั่น 2, และฟังก์ชั่น 3 ทันทีการโหลดแฟลชวูบวาบและมันหายไปในขณะที่การโทร ajax ยังไม่เกือบสมบูรณ์แม้ว่าจะmakeAjaxCall()
กลับมาแล้วก็ตาม ข้อสรุปคือการที่makeAjaxCall()
แบ่งงานของมันออกเป็นชิ้น ๆ ซึ่งมีความก้าวหน้าทีละเล็กละน้อยโดยการหมุนแต่ละครั้งของเธรด JavaScript หลัก - มันมีพฤติกรรมแบบ asychronously แต่ในเธรดหลักเดียวกันนั้นในระหว่างการหมุนหนึ่งครั้ง / วิ่งจะดำเนินการส่วนซิงโครนัสอย่างรวดเร็วและคาดการณ์ได้
ดังนั้นวิธีที่ฉันจัดการ : เช่นฉันบอกว่าฟังก์ชั่นนี้เป็นหน่วยของงานปรมาณู ฉันรวมรหัสของฟังก์ชัน 1 และ 2 - ฉันใส่รหัสของฟังก์ชัน 1 ในฟังก์ชัน 2 ก่อนการเรียก asynch ฉันได้ยกเลิกฟังก์ชั่น 1. ทุกอย่างไปจนถึงและรวมถึงการเรียกแบบอะซิงโครนัสดำเนินการตามที่คาดการณ์ไว้
จากนั้นเมื่อเสร็จสิ้นการโทรไม่ตรงกันหลังจากหลายสปินของด้าย JavaScript หลักมีมันเรียกใช้ฟังก์ชัน 3. การค้ำประกันนี้การสั่งซื้อ ตัวอย่างเช่นด้วย ajax ตัวจัดการเหตุการณ์ onreadystatechange เรียกว่าหลายครั้ง เมื่อรายงานว่าเสร็จสมบูรณ์แล้วให้เรียกฟังก์ชันสุดท้ายที่คุณต้องการ
ฉันเห็นด้วยว่ามันยุ่งกว่า ฉันชอบมีโค้ดที่สมมาตรฉันชอบที่มีฟังก์ชั่นทำสิ่งหนึ่ง (หรือใกล้กับมัน) และฉันไม่ชอบการโทร ajax ในทางใดทางหนึ่งจะต้องรับผิดชอบต่อการแสดงผล (สร้างการพึ่งพาผู้โทร) แต่ด้วยการเรียกแบบอะซิงโครนัสที่ฝังอยู่ในฟังก์ชันซิงโครนัสการประนีประนอมจะต้องทำเพื่อรับประกันลำดับการดำเนินการ และฉันต้องโค้ดสำหรับ IE 10 ดังนั้นจึงไม่มีสัญญา
สรุป : สำหรับการโทรแบบซิงโครนัสคำสั่งรับประกันเป็นเรื่องเล็กน้อย แต่ละฟังก์ชั่นดำเนินการอย่างเต็มที่ตามลำดับที่ถูกเรียก สำหรับฟังก์ชั่นที่มีการโทรแบบอะซิงโครนัสวิธีเดียวที่จะรับประกันการสั่งซื้อคือการตรวจสอบเมื่อการโทรแบบ async เสร็จสมบูรณ์และเรียกใช้ฟังก์ชันที่สามเมื่อตรวจพบสถานะนั้น
สำหรับการอภิปรายหัวข้อ JavaScript โปรดดู: https://medium.com/@francesco_rizzi/javascript-main-thread-dissected-43c85fce7e23และhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/ EventLoop
อีกคำถามที่คล้ายกันและได้รับความนิยมสูงในเรื่องนี้: ฉันจะเรียก 3 ฟังก์ชั่นเพื่อดำเนินการอย่างใดอย่างหนึ่งหลังจากที่อื่นได้อย่างไร
firstFunction
ที่ทำให้มันไม่ตรงกัน? ไม่ว่าจะด้วยวิธีใด - ตรวจสอบเกี่ยวกับสัญญา