เนื่องจากจาวาสคริปต์ในเบราว์เซอร์เป็นเธรดเดียว (ยกเว้นสำหรับผู้ทำงานบนเว็บที่ไม่ได้เกี่ยวข้องกับที่นี่) และเธรดหนึ่งของการเรียกใช้จาวาสคริปต์จะทำงานจนเสร็จสิ้นก่อนที่อีกเธรดหนึ่งจะทำงานได้คำสั่งของคุณ:
while(flag==false) {}
จะทำงานตลอดไป (หรือจนกว่าเบราว์เซอร์จะบ่นเกี่ยวกับการวนซ้ำจาวาสคริปต์ที่ไม่ตอบสนอง) หน้าเว็บจะหยุดทำงานและไม่มีจาวาสคริปต์อื่น ๆ ที่จะได้รับโอกาสในการเรียกใช้ดังนั้นค่าของค่าสถานะจะไม่สามารถเปลี่ยนแปลงได้
สำหรับคำอธิบายเพิ่มเติมเล็กน้อยJavascript เป็นภาษาเหตุการณ์ที่ขับเคลื่อนด้วย นั่นหมายความว่าจะเรียกใช้ Javascript ชิ้นหนึ่งจนกว่าจะส่งคืนการควบคุมกลับไปที่ล่าม จากนั้นเมื่อส่งกลับไปที่ล่ามเท่านั้น Javascript จะรับเหตุการณ์ถัดไปจากคิวเหตุการณ์และเรียกใช้งาน
ทุกสิ่งเช่นตัวจับเวลาและเหตุการณ์เครือข่ายจะทำงานผ่านคิวเหตุการณ์ ดังนั้นเมื่อตัวจับเวลาเริ่มทำงานหรือมีคำขอเครือข่ายมาถึงตัวจับเวลาจะไม่ "ขัดจังหวะ" Javascript ที่กำลังทำงานอยู่ เหตุการณ์จะถูกใส่ไว้ในคิวเหตุการณ์ Javascript แทนจากนั้นเมื่อ Javascript ที่รันอยู่ในปัจจุบันเสร็จสิ้นเหตุการณ์ถัดไปจะถูกดึงออกจากคิวเหตุการณ์และจะเปิดให้รัน
ดังนั้นเมื่อคุณทำวนซ้ำแบบไม่สิ้นสุดเช่นwhile(flag==false) {}
Javascript ที่กำลังทำงานอยู่จะไม่สิ้นสุดดังนั้นเหตุการณ์ถัดไปจะไม่ถูกดึงออกจากคิวเหตุการณ์ดังนั้นค่าของการflag
ไม่เคยเปลี่ยนแปลง พวกเขาที่สำคัญที่นี่เป็นที่จาวาสคริปต์ที่ไม่ได้ขับเคลื่อนการขัดจังหวะ เมื่อตัวจับเวลาเริ่มทำงานจะไม่ขัดจังหวะ Javascript ที่กำลังทำงานอยู่เรียกใช้ Javascript อื่น ๆ จากนั้นปล่อยให้ Javascript ที่กำลังทำงานอยู่ดำเนินการต่อ มันจะถูกใส่ไว้ในคิวเหตุการณ์ที่รอจนกว่า Javascript ที่รันอยู่ในปัจจุบันจะเสร็จสิ้นเพื่อให้รันได้
สิ่งที่คุณต้องทำคือคิดใหม่ว่าโค้ดของคุณทำงานอย่างไรและหาวิธีอื่นในการทริกเกอร์โค้ดที่คุณต้องการเรียกใช้เมื่อflag
ค่าเปลี่ยนไป Javascript ได้รับการออกแบบให้เป็นภาษาที่ขับเคลื่อนด้วยเหตุการณ์ ดังนั้นสิ่งที่คุณต้องทำคือค้นหาเหตุการณ์ที่คุณสามารถลงทะเบียนความสนใจเพื่อที่คุณจะได้ฟังเหตุการณ์ที่อาจทำให้แฟล็กเปลี่ยนไปและคุณสามารถตรวจสอบแฟล็กของเหตุการณ์นั้นหรือคุณสามารถเรียกเหตุการณ์ของคุณเองจาก รหัสใด ๆ ที่อาจเปลี่ยนแฟล็กหรือคุณสามารถใช้ฟังก์ชันการโทรกลับซึ่งโค้ดใด ๆ ที่เปลี่ยนแปลงแฟล็กนั้นสามารถโทรกลับของคุณได้ทุกครั้งที่โค้ดที่รับผิดชอบในการเปลี่ยนค่าแฟล็กจะเปลี่ยนค่าtrue
เป็นเพียงแค่เรียกใช้ฟังก์ชันเรียกกลับและโค้ดของคุณ ที่ต้องการทำงานเมื่อตั้งค่าสถานะเป็นtrue
จะได้วิ่งในเวลาที่เหมาะสม สิ่งนี้มีประสิทธิภาพมากกว่าการพยายามใช้ตัวจับเวลาบางประเภทเพื่อตรวจสอบค่าสถานะอย่างต่อเนื่อง
function codeThatMightChangeFlag(callback) {
if (condition happens to change flag value) {
callback();
}
}
jQuery.Deferred
,Q
,async
...