มีฟังก์ชันตัวจับเวลาสองประเภท (ส่วนใหญ่ใช้) ในจาวาสคริปต์setTimeout
และsetInterval
( อื่น ๆ )
ทั้งสองวิธีนี้มีลายเซ็นเหมือนกัน พวกเขาใช้ฟังก์ชั่นโทรกลับและเวลาล่าช้าเป็นพารามิเตอร์
setTimeout
ดำเนินการเพียงครั้งเดียวหลังจากที่ล่าช้าในขณะที่setInterval
ยังคงโทรฟังก์ชั่นการโทรกลับหลังจาก milisecs ล่าช้าทุกครั้ง
ทั้งวิธีการเหล่านี้จะส่งกลับตัวระบุจำนวนเต็มที่สามารถใช้ในการล้างพวกเขาก่อนที่ตัวจับเวลาจะหมดอายุ
clearTimeout
และclearInterval
ทั้งสองวิธีนี้ใช้ตัวระบุจำนวนเต็มซึ่งส่งคืนจากฟังก์ชันด้านบนsetTimeout
และsetInterval
ตัวอย่าง:
setTimeout
alert("before setTimeout");
setTimeout(function(){
alert("I am setTimeout");
},1000); //delay is in milliseconds
alert("after setTimeout");
หากคุณเรียกใช้รหัสข้างต้นคุณจะเห็นว่ามันแจ้งเตือนbefore setTimeout
แล้วafter setTimeout
ในที่สุดก็แจ้งเตือนI am setTimeout
หลังจาก 1 วินาที (1000ms)
สิ่งที่คุณสามารถสังเกตได้จากตัวอย่างคือsetTimeout(...)
อะซิงโครนัสซึ่งหมายความว่ามันไม่รอให้ตัวจับเวลาผ่านไปก่อนที่จะไปยังคำสั่งถัดไปเช่นalert("after setTimeout");
ตัวอย่าง:
setInterval
alert("before setInterval"); //called first
var tid = setInterval(function(){
//called 5 times each time after one second
//before getting cleared by below timeout.
alert("I am setInterval");
},1000); //delay is in milliseconds
alert("after setInterval"); //called second
setTimeout(function(){
clearInterval(tid); //clear above interval after 5 seconds
},5000);
หากคุณเรียกใช้รหัสข้างต้นคุณจะเห็นว่ามันแจ้งเตือนbefore setInterval
แล้วafter setInterval
ในที่สุดก็แจ้งเตือนI am setInterval
5 ครั้งหลังจาก 1sec (1000ms) เพราะ setTimeout ล้างจับเวลาหลังจาก 5 วินาทีหรืออื่น ๆ ทุก 1 วินาทีคุณจะได้รับการแจ้งเตือนอย่างI am setInterval
ไม่มีที่สิ้นสุด
เบราว์เซอร์ทำหน้าที่อย่างไรภายใน
ฉันจะอธิบายโดยย่อ
เพื่อให้เข้าใจว่าคุณต้องรู้เกี่ยวกับคิวเหตุการณ์ในจาวาสคริปต์ มีคิวเหตุการณ์ที่ใช้ในเบราว์เซอร์ เมื่อใดก็ตามที่เหตุการณ์ถูกเรียกใน js เหตุการณ์เหล่านี้ทั้งหมด (เช่นคลิก ฯลฯ .. ) จะถูกเพิ่มในคิวนี้ เมื่อเบราว์เซอร์ของคุณไม่มีอะไรดำเนินการก็จะใช้กิจกรรมจากคิวและดำเนินการทีละรายการ
ตอนนี้เมื่อคุณโทรsetTimeout
หรือsetInterval
โทรกลับของคุณได้รับการลงทะเบียนกับตัวจับเวลาในเบราว์เซอร์และมันจะถูกเพิ่มเข้าไปในคิวเหตุการณ์หลังจากเวลาที่กำหนดหมดอายุลงและในที่สุด javascript จะใช้เหตุการณ์จากคิวและดำเนินการ
สิ่งนี้เกิดขึ้นเนื่องจากเครื่องมือจาวาสคริปต์เป็นเธรดเดี่ยวและสามารถดำเนินการได้ครั้งละหนึ่งสิ่งเท่านั้น ดังนั้นจึงไม่สามารถเรียกใช้ javascript อื่น ๆ และติดตามการจับเวลาของคุณได้ นั่นคือเหตุผลที่ตัวจับเวลาเหล่านี้ลงทะเบียนกับเบราว์เซอร์ (เบราว์เซอร์ไม่ใช่เธรดเดี่ยว) และสามารถติดตามตัวจับเวลาและเพิ่มเหตุการณ์ในคิวหลังจากตัวจับเวลาหมดอายุ
จะเกิดขึ้นเช่นกันsetInterval
เฉพาะในกรณีนี้เหตุการณ์จะถูกเพิ่มในคิวอีกครั้งและอีกครั้งหลังจากช่วงเวลาที่ระบุจนกว่าจะได้รับการล้างหรือหน้าเบราว์เซอร์รีเฟรช
บันทึก
พารามิเตอร์การหน่วงเวลาที่คุณส่งไปยังฟังก์ชั่นเหล่านี้คือเวลาหน่วงขั้นต่ำที่จะดำเนินการติดต่อกลับ นี่เป็นเพราะหลังจากตัวจับเวลาหมดอายุเบราว์เซอร์จะเพิ่มเหตุการณ์ในคิวที่จะดำเนินการโดยโปรแกรมจาวาสคริปต์ แต่การดำเนินการโทรกลับขึ้นอยู่กับตำแหน่งกิจกรรมของคุณในคิวและเนื่องจากเอ็นจิ้นเป็นเธรดเดียว คิวหนึ่งโดยหนึ่ง
ดังนั้นการโทรกลับของคุณอาจใช้เวลานานกว่าเวลาหน่วงที่ระบุเพื่อเรียกเป็นพิเศษเมื่อโค้ดอื่น ๆ ของคุณบล็อกเธรดและไม่ให้เวลาในการประมวลผลสิ่งที่อยู่ในคิว
และอย่างที่ฉันได้กล่าวถึงจาวาสคริปต์คือเธรดเดียว ดังนั้นหากคุณบล็อกเธรดเป็นเวลานาน
ชอบรหัสนี้
while(true) { //infinite loop
}
ผู้ใช้ของคุณอาจได้รับข้อความว่าหน้าไม่ตอบสนอง
setTimeout(function(){/*YourCode*/},1000);