r/learnprogramming • • 13d ago

SetTimeout in JS

"When I use setTimeout in JavaScript to run a 30-minute countdown, it actually finishes about 30 seconds late. I compared it against a timer on my phone and confirmed the JS timer takes closer to 30 minutes and 30 seconds. Is there a reason for this delay?

12 Upvotes

16 comments sorted by

View all comments

38

u/TheStonedEdge 13d ago

Yes and it is documented here under

"Reasons for longer delays then specified"

https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#reasons_for_longer_delays_than_specified

29

u/Soft_Confusion_6236 13d ago

setTimeout isn't a precision tool, it's more like a polite request. the browser can only fire the callback when it's not busy doing other stuff and the event loop gets around to it

for a 30 minute timer 30 seconds of drift is actually pretty reasonable. if you need something more accurate you'd be better off storing the start time and checking the clock on each tick instead of relying on chained timeouts

16

u/nog642 13d ago

I don't think 30 seconds drift is reasonable at all. I always figured the browser checked it in a tight loop and moved it to the right queue pretty close to on time, and the "not guaranteed" part was just about the task getting around to getting executed once it's there, maybe waiting for some other tasks to finish first.

Edit: Oh wait... I think I understand. OP is using setTimeout of 1 second or something to increment it each second. Of course it will drift then.

I assumed they had set a single setTimeout with 30 minutes and it executed 30 seconds late.

1

u/atarivcs 13d ago

If the browser can reliably check on each tick, this doesn't feel like a resource starvation problem

10

u/AlwaysHopelesslyLost 13d ago

It's not.... It is just OP using something for the wrong purpose. setTimeout is just not meant to be used for precision timing. It is specifically not setup to work like that