มีความแตกต่างหรือไม่?
ใช่. การหมดเวลาดำเนินการตามระยะเวลาที่กำหนดหลังจากที่เรียกว่า setTimeout () ช่วงเวลาดำเนินการจำนวนหนึ่งของเวลาหลังจากช่วงเวลาก่อนหน้ายิง
คุณจะสังเกตเห็นความแตกต่างหากฟังก์ชั่น doStuff () ของคุณใช้เวลาสักครู่ในการดำเนินการ ตัวอย่างเช่นถ้าเราแสดงการเรียกไปยัง setTimeout / setInterval ด้วย.
การยิงของการหมดเวลา / ช่วงเวลาด้วย*
และการเรียกใช้โค้ด JavaScript ด้วย[-----]
ไทม์ไลน์จะมีลักษณะดังนี้:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
ภาวะแทรกซ้อนต่อไปคือถ้าช่วงเวลาที่ไฟขณะที่ JavaScript กำลังยุ่งอยู่กับการทำบางสิ่งบางอย่าง (เช่นการจัดการช่วงเวลาก่อนหน้า) ในกรณีนี้ช่วงเวลาจะถูกจดจำและเกิดขึ้นทันทีที่ตัวจัดการก่อนหน้านี้เสร็จสิ้นและกลับไปควบคุมเบราว์เซอร์ ตัวอย่างเช่นสำหรับกระบวนการ doStuff () ที่บางครั้งสั้น ([-]) และบางครั้งยาว ([-----]):
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
•แสดงช่วงเวลาการยิงที่ไม่สามารถเรียกใช้รหัสได้ทันทีและถูกระงับไว้
ดังนั้นช่วงเวลาลอง 'ทัน' เพื่อกลับตามกำหนดเวลา แต่พวกเขาไม่ได้คิวหนึ่งอยู่ด้านบนของกันและกัน: จะมีเพียงหนึ่งการดำเนินการที่ค้างอยู่ต่อช่วงเวลา (หากพวกเขาทั้งหมดเข้าคิวเบราว์เซอร์จะถูกทิ้งไว้พร้อมกับรายการการประหารที่โดดเด่น!)
. * • • x • • x
[------][------][------][------]
x หมายถึงการยิงช่วงเวลาที่ไม่สามารถดำเนินการหรือรอดำเนินการดังนั้นจึงถูกยกเลิก
หากฟังก์ชั่น doStuff () ของคุณใช้เวลาในการดำเนินการนานกว่าช่วงเวลาที่กำหนดไว้เบราว์เซอร์จะกิน CPU 100% ที่พยายามให้บริการและอาจตอบสนองน้อยลง
คุณใช้อันไหนและเพราะอะไร
Chained-Timeout มอบช่วงเวลาว่างที่รับประกันให้กับเบราว์เซอร์ ช่วงพยายามที่จะให้แน่ใจว่าฟังก์ชั่นที่กำลังรันจะทำงานใกล้เคียงที่สุดเท่าที่จะเป็นไปได้ตามกำหนดเวลา
ฉันจะพิจารณาช่วงเวลาสำหรับการเคลื่อนไหวแบบครั้งเดียวที่ฉันต้องการให้ราบรื่นที่สุดเท่าที่จะเป็นไปได้ในขณะที่ไทม์เอาท์ที่ถูกผูกมัดนั้นมีความสุภาพมากกว่าสำหรับการเคลื่อนไหวต่อเนื่องที่จะเกิดขึ้นตลอดเวลาในขณะที่โหลดหน้าเว็บ สำหรับการใช้งานที่มีความต้องการน้อยลง (เช่นตัวอัปเดตที่น่าสนใจซึ่งยิงทุก 30 วินาทีหรือบางอย่าง) คุณสามารถใช้อย่างปลอดภัย
ในแง่ของความเข้ากันได้ของเบราว์เซอร์ setTimeout จะมี setInterval แต่เบราว์เซอร์ทั้งหมดที่คุณจะพบในวันนี้จะรองรับทั้งสอง คนสุดท้ายที่หลงทางมานานหลายปีคือ IE Mobile ใน WinMo <6.5 แต่หวังว่าตอนนี้เราจะอยู่ข้างหลังเราเช่นกัน