ใน JS หากคุณวางแผนที่จะใช้ setInterval สำหรับการนับถอยหลังเวลาและฟังก์ชั่นอื่น ๆ มันมักจะไม่ถูกต้องเนื่องจากฟังก์ชั่นการเรียกกลับของ setInterval จะไม่ถูกดำเนินการทันทีหลังจากถึงเวลา แต่จะไม่ถูกดำเนินการจนกว่าทรัพยากรการคำนวณของระบบจะไม่ได้ใช้งาน เวลาทริกเกอร์ถัดไปจะไม่เริ่มต้นหลังจากฟังก์ชั่นการเรียกกลับ setInterval ดังนั้นหากการคำนวณที่ดำเนินการใน setInterval ใช้เวลานานเกินไปหรือมีงานที่ใช้เวลานานในการดำเนินการเวลาของ setInterval จะไม่ถูกต้องมากขึ้นและมีความล่าช้าอย่างร้ายแรง
รหัสต่อไปนี้สามารถแสดงปัญหานี้ได้
การคัดลอกรหัสมีดังนี้:
var startTime = new Date (). getTime ();
count var = 0;
// งานที่ใช้เวลานาน
setInterval (function () {
var i = 0;
ในขณะที่ (i ++ <100000000);
}, 0);
setInterval (function () {
นับ ++;
console.log (วันที่ใหม่ (). getTime () - (เริ่มต้น + นับ * 1000));
}, 1,000);
รหัสส่งออกเวลาทริกเกอร์ setInterval และมิลลิวินาทีที่ล่าช้าที่ควรเรียกใช้อย่างถูกต้อง
การคัดลอกรหัสมีดังนี้:
176
340
495
652
807
961
1114
1268
1425
1579
2277
พ.ศ. 2431
2048
2201
2357
2521
2679
2834
2996
-
จะเห็นได้ว่าความล่าช้านั้นแย่ลงเรื่อย ๆ
เพื่อที่จะใช้ฟังก์ชั่นการกำหนดเวลาที่ค่อนข้างแม่นยำใน JS เราสามารถทำได้
การคัดลอกรหัสมีดังนี้:
var startTime = new Date (). getTime ();
count var = 0;
setInterval (function () {
var i = 0;
ในขณะที่ (i ++ <100000000);
}, 0);
ฟังก์ชั่นแก้ไข () {
นับ ++;
var Offset = new Date (). getTime () - (เริ่มต้น + นับ * 1000);
var nexttime = 1000 - ออฟเซ็ต;
if (nexttime <0) nextime = 0;
settimeout (แก้ไขในครั้งต่อไป);
console.log (วันที่ใหม่ (). getTime () - (เริ่มต้น + นับ * 1000));
-
settimeout (คงที่ 1,000);
ในรหัสช่องว่างระหว่างเวลาปัจจุบันและเวลาที่ถูกต้องคำนวณโดยการลบ 1,000 (นั่นคือช่วงเวลา) ซึ่งจะแก้ไขความล่าช้าของทริกเกอร์ปัจจุบัน
ด้านล่างคือผลลัพธ์
การคัดลอกรหัสมีดังนี้:
186
200
230
271
158
899
900
899
900
899
899
899
902
899
418
202
232
266
145
174
192
214
242
268
149
179
214
-
จะเห็นได้ว่าถึงแม้ว่าเวลาทริกเกอร์จะไม่ถูกต้องอย่างแน่นอนเนื่องจากทริกเกอร์แต่ละตัวได้รับการแก้ไขในเวลา แต่ก็ไม่มีการสะสมข้อผิดพลาดเกิดขึ้น