Du har sannsynligvis trengt at nettstedet ditt skal gjøre noe på et tidspunkt, men ikke umiddelbart, men heller etter noen få sekunder. For å oppnå dette tilbyr JavaScript et grunnleggende verktøy kalt `setTimeout` , som i hovedsak fungerer som en timer som, når den når null, utløser en spesifikk handling. Det er en av de funksjonene som virker enkle ved første øyekast, men den har sine særegenheter og tekniske detaljer som er verdt å vite for å unngå å gjøre feil under programmering.
Selv om vi ser det stadig vekk i nettleseren, er det viktig å presisere at denne metoden ikke er en del av selve kjernespråket i JavaScript, men snarere leveres av runtime-miljøet . Dette betyr at selv om vi bruker den i Chrome eller Firefox, finner vi den også i Node.js, om enn med noen forskjeller i hva systemet returnerer. La oss se nærmere på hvordan det fungerer, fra det grunnleggende til avanserte triks for å få applikasjonene dine til å kjøre problemfritt.
Hva er egentlig setTimeout, og hvordan brukes det?

Enkelt sagt lar denne globale metoden deg planlegge utførelsen av en kodebit eller en funksjon etter at en angitt tid har gått . Når timeren utløper og funksjonen utføres, avsluttes prosessen; det vil si at den ikke gjentas automatisk. Den grunnleggende syntaksen krever at du spesifiserer hva du vil gjøre og hvor lenge du skal vente, alltid uttrykt i millisekunder (husk at 1000 ms tilsvarer ett sekund).
For å starte det opp kan vi sende en funksjon som det første argumentet. Av historiske årsaker er det imidlertid også mulig å sende en tekststreng som inneholder kode, selv om dette i dag anses som dårlig praksis, og det er mye bedre å bruke pilfunksjoner eller referanser til navngitte funksjoner for å holde koden ren og trygg.
Parametere og fleksibilitet i utførelse

Når vi konfigurerer timeren, er den andre parameteren forsinkelsen . Hvis vi ikke spesifiserer noe, er standardverdien 0. Men her er den interessante delen: hva om funksjonen vår trenger eksterne data? Det er to hovedmåter å håndtere dette på. Den første er gjennom en anonym funksjon som pakker inn det opprinnelige kallet, slik at vi kan sende inn alle argumenter vi ønsker. Den andre, og mer elegante, måten er å dra nytte av det faktum at `setTimeout` lar oss legge til flere argumenter fra og med den tredje parameteren, som er mappet direkte til tilbakekallingsfunksjonen.
Avbestillingshåndtering med clearTimeout

Noen ganger tar livet uventede vendinger, og vi må avbryte en planlagt oppgave som ennå ikke har kjørt. For å gjøre dette må vi vite at `setTimeout` returnerer en unik identifikator (en `timerId`). I nettlesere er denne ID-en vanligvis et tall, mens den i Node.js er et mer komplekst objekt. Hvis vi lagrer denne verdien i en variabel, kan vi kalle ` clearTimeout(timerId)` -funksjonen for å avbryte operasjonen og forhindre at koden kjøres, og dermed spare systemressurser.
Sammenligning: setTimeout vs. setInterval

Det er veldig vanlig å forveksle disse to metodene. Mens `setTimeout` bare utfører funksjonen én gang, utfører `setInterval` den gjentatte ganger hver gang det definerte intervallet utløper. Det finnes imidlertid et avansert triks: nestet `setTimeout` . Dette innebærer å kalle en ny `setTimeout` rett på slutten av den gjeldende funksjonens utførelse.
Denne teknikken er mye mer fleksibel enn `setInterval` fordi den garanterer en reell og konstant forsinkelse mellom slutten av én oppgave og starten på den neste. Med `setInterval`, hvis funksjonen tar lengre tid å utføre enn intervalltiden, kan kall hope seg opp eller kjøre uten pause. I motsetning til dette lar nøsting deg justere tiden dynamisk, noe som er viktig hvis du for eksempel sender forespørsler til en server som kan være overbelastet og du må øke venteintervallet.
Det merkelige tilfellet med null forsinkelse og begrensninger
Hvis du bruker `setTimeout(func, 0)` , kan du tro at funksjonen kjøres umiddelbart, men det er ikke tilfelle. Det som skjer er at planleggeren setter oppgaven i kø for å kjøre så snart som mulig , men alltid etter at det gjeldende skriptet er helt ferdig. Det er en måte å si: «Fullfør det du gjør, og så snart du kan, gjør dette.»
Videre er det viktig å merke seg at nettlesere har en minimumsgrense på 4 ms for nestede tidtakere etter at de har kjørt fem ganger på rad. Dette er en overlevering fra eldre versjoner for å forhindre at nettleseren krasjer. Presisjonen er imidlertid ikke eksakt; hvis CPU-en er overbelastet eller fanen kjører i bakgrunnen , kan nettleseren forsinke kjøringen med opptil 300 ms eller til og med et helt sekund for å spare batteristrøm.
Implementering i moderne rammeverk
Denne metoden oversettes perfekt til verktøy som React eller Angular. I React er den ideelle tilnærmingen å pakke `setTimeout` inn i en `useEffect`- krok for å kontrollere komponentens livssyklus og sikre at timeren nullstilles med return-funksjonen, og dermed forhindre minnelekkasjer. I Angular kan den enkelt integreres i komponentens konstruktør eller livssykluskroker for å utløse varsler eller laste inn asynkrone data.
For de som ønsker høyere kompleksitetsnivåer, kan tidtakere kombineres med Promises og async/await . Dette muliggjør opprettelse av mye mer lesbare og profesjonelle ventesekvenser, unngår det beryktede «tilbakeringingshelvetet» og gjør det mulig å administrere flere tidtakere asynkront og på en ordnet måte.
Evnen til å administrere tid i JavaScript er grunnleggende for å lage dynamiske grensesnitt, fra digitale klokker og animasjoner til systemer for tilkoblingsforsøk. Å mestre `setTimeout`, overstyre det med `clearTimeout` og forstå hvordan det samhandler med hendelsesløkken lar deg optimalisere applikasjonsytelsen og forbedre sluttbrukeropplevelsen, alltid med tanke på at tidsnøyaktigheten avhenger sterkt av miljøet og systembelastningen.