{"id":5818,"date":"2021-11-18T01:00:00","date_gmt":"2021-11-18T00:00:00","guid":{"rendered":"https:\/\/alvarotrigo.com\/epa\/wait-1-second-javascript\/"},"modified":"2026-02-24T21:40:46","modified_gmt":"2026-02-24T20:40:46","slug":"wait-1-second-javascript","status":"publish","type":"post","link":"https:\/\/alvarotrigo.com\/blog\/wait-1-second-javascript\/","title":{"rendered":"JavaScript Wait 1 Second: Best Methods [ + Examples ]"},"content":{"rendered":"\n<p>Need to make JavaScript wait 1 second (1000ms)? Use a non-blocking delay. JavaScript cannot truly \u201csleep\u201d the main thread without freezing the page.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"javascript-wait-1-second-1000ms-the-best-options\">JavaScript wait 1 second (1000ms), the best options<\/h2>\n\n\n<p>Pick the pattern that matches your code style. All three schedule work later, they do not pause execution synchronously.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><code>setTimeout(() =&gt; { ... }, 1000)<\/code> for callback-based code<\/li><li><code>await delay(1000)<\/code> for async\/await flows (recommended)<\/li><li><code>await setTimeout(1000)<\/code> in Node.js with <code>node:timers\/promises<\/code><\/li><\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/\/ 1) Callback style<\/span>\nsetTimeout(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"after 1 second\"<\/span>);\n}, <span class=\"hljs-number\">1000<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/\/ 2) async\/await style<\/span>\n<span class=\"hljs-keyword\">await<\/span> delay(<span class=\"hljs-number\">1000<\/span>);\n<span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"after 1 second\"<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/\/ 3) Node.js (v15+) promise timer<\/span>\n<span class=\"hljs-keyword\">import<\/span> { setTimeout } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"node:timers\/promises\"<\/span>;\n<span class=\"hljs-keyword\">await<\/span> setTimeout(<span class=\"hljs-number\">1000<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<h2 class=\"wp-block-heading\" id=\"wait-using-settimeout\">Option 1, Wait 1 second using setTimeout (browser or Node)<\/h2>\n\n\n<p><code>setTimeout<\/code> is the classic \u201cwait 1 second\u201d tool. It schedules a callback to run later, it does not block your code.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"Executed now\"<\/span>);\n\n<span class=\"hljs-comment\">\/\/ 1 second delay<\/span>\nsetTimeout(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"Executed after 1 second\"<\/span>);\n}, <span class=\"hljs-number\">1000<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The second argument is milliseconds. For 1 second, pass <code>1000<\/code>.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"settimeout-does-not-block-heres-the-execution-order\">setTimeout does not block, here\u2019s the execution order<\/h3>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"Executed now\"<\/span>);\n\nsetTimeout(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"Executed after 1 second\"<\/span>);\n}, <span class=\"hljs-number\">1000<\/span>);\n\n<span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"Executed before the delay\"<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Expected output order:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>Executed now<\/code><\/li><li><code>Executed before the delay<\/code><\/li><li><code>Executed after 1 second<\/code><\/li><\/ul>\n\n\n\n<p>Code after <code>setTimeout<\/code> runs immediately because the callback is queued for later.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"common-settimeout-mistakes\">Common setTimeout mistakes<\/h3>\n\n\n<ul class=\"wp-block-list\"><li>Forgetting that code after <code>setTimeout<\/code> runs right away<\/li><li>Nesting many timers and creating callback hell<\/li><li>Using a string callback like <code>setTimeout(\"doStuff()\", 1000)<\/code>, don\u2019t do that<\/li><\/ul>\n\n\n<h2 class=\"wp-block-heading\" id=\"wait-using-promise\">Option 2, JavaScript sleep 1 second with Promise + async\/await (recommended)<\/h2>\n\n\n<p>If you\u2019re searching for \u201cjavascript sleep 1 second\u201d, this is the clean approach. You still are not blocking the thread, you\u2019re just awaiting a Promise that resolves after 1000ms.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"copypaste-delay-helper\">Copy-paste delay() helper<\/h3>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> delay = <span class=\"hljs-function\">(<span class=\"hljs-params\">ms<\/span>) =&gt;<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Promise<\/span>(<span class=\"hljs-function\">(<span class=\"hljs-params\">resolve<\/span>) =&gt;<\/span> setTimeout(resolve, ms));\n\n<span class=\"hljs-keyword\">await<\/span> delay(<span class=\"hljs-number\">1000<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Drop that helper into your project, then use <code>await delay(1000)<\/code> anywhere inside an <code>async<\/code> function.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> delay = <span class=\"hljs-function\">(<span class=\"hljs-params\">ms<\/span>) =&gt;<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Promise<\/span>(<span class=\"hljs-function\">(<span class=\"hljs-params\">resolve<\/span>) =&gt;<\/span> setTimeout(resolve, ms));\n\n<span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">init<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"now\"<\/span>);\n\n  <span class=\"hljs-keyword\">await<\/span> delay(<span class=\"hljs-number\">1000<\/span>);\n  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"after 1 second\"<\/span>);\n\n  <span class=\"hljs-keyword\">await<\/span> delay(<span class=\"hljs-number\">1000<\/span>);\n  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"after 2 seconds\"<\/span>);\n}\n\ninit();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>CTA:<\/strong> Copy the <code>delay()<\/code> helper and use <code>await delay(1000)<\/code> in your async functions. It keeps timing code readable.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"example-sequential-waits-with-asyncawait\">Example, sequential waits with async\/await<\/h3>\n\n\n<p>Async\/await shines when you need multiple waits in a row without nesting callbacks.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> delay = <span class=\"hljs-function\">(<span class=\"hljs-params\">ms<\/span>) =&gt;<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Promise<\/span>(<span class=\"hljs-function\">(<span class=\"hljs-params\">resolve<\/span>) =&gt;<\/span> setTimeout(resolve, ms));\n\n<span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">run<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n  <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">let<\/span> i = <span class=\"hljs-number\">1<\/span>; i &lt;= <span class=\"hljs-number\">3<\/span>; i++) {\n    <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">`step <span class=\"hljs-subst\">${i}<\/span>`<\/span>);\n    <span class=\"hljs-keyword\">await<\/span> delay(<span class=\"hljs-number\">1000<\/span>);\n  }\n  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"done\"<\/span>);\n}\n\nrun();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<h3 class=\"wp-block-heading\" id=\"browser-support\">Browser support<\/h3>\n\n\n<p>Promises and async\/await work in modern browsers. If you must support very old browsers like IE11, you need a polyfill or transpile your code.<\/p>\n\n\n\n<p>You can test it here:<\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\">CodePen Embed Fallback<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"option-3-nodejs-wait-1-second-with-timerspromises\">Option 3, Node.js wait 1 second with timers\/promises<\/h2>\n\n\n<p>In Node.js, you can use the built-in promise-based timers API. It reads nicely and avoids writing your own helper.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"nodejs-v15-builtin-promise-settimeout\">Node.js (v15+) built-in promise setTimeout<\/h3>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> { setTimeout } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"node:timers\/promises\"<\/span>;\n\n<span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"now\"<\/span>);\n<span class=\"hljs-keyword\">await<\/span> setTimeout(<span class=\"hljs-number\">1000<\/span>);\n<span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"after 1 second\"<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<h3 class=\"wp-block-heading\" id=\"nodejs-commonjs-version\">Node.js CommonJS version<\/h3>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> { setTimeout } = <span class=\"hljs-built_in\">require<\/span>(<span class=\"hljs-string\">\"node:timers\/promises\"<\/span>);\n\n<span class=\"hljs-function\">(<span class=\"hljs-params\"><span class=\"hljs-keyword\">async<\/span> (<\/span>) =&gt;<\/span> {\n  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"now\"<\/span>);\n  <span class=\"hljs-keyword\">await<\/span> setTimeout(<span class=\"hljs-number\">1000<\/span>);\n  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"after 1 second\"<\/span>);\n})();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<h3 class=\"wp-block-heading\" id=\"when-to-use-this-vs-delay\">When to use this vs delay()<\/h3>\n\n\n<p>Use <code>node:timers\/promises<\/code> when you\u2019re in Node 15+. Use a <code>delay()<\/code> helper when you want the same code to work in both browser and Node.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"wait-using-a-loop\">Avoid this, blocking \u201csleep\u201d loops freeze the page<\/h2>\n\n\n<p>A busy-wait loop blocks the main thread. It freezes UI, delays rendering, and can make your page look broken. Avoid it except for demos.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"busywait-example-not-recommended\">Busy-wait example (not recommended)<\/h3>\n\n\n<p><strong>Warning:<\/strong> Do not use in production.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> wait = <span class=\"hljs-function\">(<span class=\"hljs-params\">ms<\/span>) =&gt;<\/span> {\n  <span class=\"hljs-keyword\">const<\/span> start = <span class=\"hljs-built_in\">Date<\/span>.now();\n  <span class=\"hljs-keyword\">let<\/span> now = start;\n  <span class=\"hljs-keyword\">while<\/span> (now - start &lt; ms) {\n    now = <span class=\"hljs-built_in\">Date<\/span>.now();\n  }\n};\n\n<span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"Executed now\"<\/span>);\nwait(<span class=\"hljs-number\">1000<\/span>);\n<span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"Executed after 1 second\"<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The loop keeps the CPU busy until time passes. No clicks, no paints, no smooth scrolling, nothing else gets a turn.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"why-the-dom-does-not-update-during-a-busy-wait\">Why the DOM does not update during a busy wait<\/h3>\n\n\n<p>Browsers update the DOM between tasks, after the call stack clears. A busy-wait never lets the stack clear, so rendering and events get stuck until your loop ends.<\/p>\n\n\n\n<p>And to prove it, see the following example, where the <code>console.log<\/code> gets fired after 1 second (as we would expect), but both of the DOM writes happen at the same time:<\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\">CodePen Embed Fallback<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"realworld-use-cases-for-a-1second-delay\">Real-world use cases for a 1-second delay<\/h2>\n\n\n<p>A 1-second wait is common for UI timing, polling, and simple rate limiting. Use a non-blocking delay so your app stays responsive.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"ui-delay-in-the-browser-spinner-tooltip\">UI delay in the browser (spinner, tooltip)<\/h3>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> delay = <span class=\"hljs-function\">(<span class=\"hljs-params\">ms<\/span>) =&gt;<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Promise<\/span>(<span class=\"hljs-function\">(<span class=\"hljs-params\">resolve<\/span>) =&gt;<\/span> setTimeout(resolve, ms));\n\n<span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">showSpinnerForOneSecond<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n  <span class=\"hljs-keyword\">const<\/span> spinner = <span class=\"hljs-built_in\">document<\/span>.querySelector(<span class=\"hljs-string\">\"#spinner\"<\/span>);\n  spinner.hidden = <span class=\"hljs-literal\">false<\/span>;\n\n  <span class=\"hljs-keyword\">await<\/span> delay(<span class=\"hljs-number\">1000<\/span>);\n\n  spinner.hidden = <span class=\"hljs-literal\">true<\/span>;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<h3 class=\"wp-block-heading\" id=\"polling-every-second\">Polling every second<\/h3>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> delay = <span class=\"hljs-function\">(<span class=\"hljs-params\">ms<\/span>) =&gt;<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Promise<\/span>(<span class=\"hljs-function\">(<span class=\"hljs-params\">resolve<\/span>) =&gt;<\/span> setTimeout(resolve, ms));\n\n<span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">pollStatus<\/span>(<span class=\"hljs-params\">getStatus<\/span>) <\/span>{\n  <span class=\"hljs-keyword\">while<\/span> (<span class=\"hljs-literal\">true<\/span>) {\n    <span class=\"hljs-keyword\">const<\/span> status = <span class=\"hljs-keyword\">await<\/span> getStatus();\n    <span class=\"hljs-keyword\">if<\/span> (status === <span class=\"hljs-string\">\"done\"<\/span>) <span class=\"hljs-keyword\">return<\/span> status;\n    <span class=\"hljs-keyword\">await<\/span> delay(<span class=\"hljs-number\">1000<\/span>);\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<h3 class=\"wp-block-heading\" id=\"rate-limiting-api-calls-1-request-per-second\">Rate limiting API calls (1 request per second)<\/h3>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> delay = <span class=\"hljs-function\">(<span class=\"hljs-params\">ms<\/span>) =&gt;<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Promise<\/span>(<span class=\"hljs-function\">(<span class=\"hljs-params\">resolve<\/span>) =&gt;<\/span> setTimeout(resolve, ms));\n\n<span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">fetchWithOneSecondGap<\/span>(<span class=\"hljs-params\">urls<\/span>) <\/span>{\n  <span class=\"hljs-keyword\">const<\/span> results = &#91;];\n\n  <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">const<\/span> url <span class=\"hljs-keyword\">of<\/span> urls) {\n    <span class=\"hljs-keyword\">const<\/span> res = <span class=\"hljs-keyword\">await<\/span> fetch(url);\n    results.push(<span class=\"hljs-keyword\">await<\/span> res.json());\n    <span class=\"hljs-keyword\">await<\/span> delay(<span class=\"hljs-number\">1000<\/span>);\n  }\n\n  <span class=\"hljs-keyword\">return<\/span> results;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<h2 class=\"wp-block-heading\" id=\"pitfalls-and-accuracy-why-1-second-is-not-always-exact\">Pitfalls and accuracy, why \u201c1 second\u201d is not always exact<\/h2>\n\n\n<p>Even with <code>setTimeout(..., 1000)<\/code>, the callback runs \u201cnot before 1000ms\u201d, not \u201cexactly at 1000ms\u201d.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"inactive-tabs-can-throttle-timers\">Inactive tabs can throttle timers<\/h3>\n\n\n<p>Browsers often throttle timers in background tabs to save battery and CPU. Your \u201cwait 1 second\u201d might become several seconds if the tab is inactive.<\/p>\n\n\n\n<p>If you need precise scheduling, don\u2019t rely on timers alone. Measure real elapsed time and correct for it.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"minimum-delay-and-timer-drift\">Minimum delay and timer drift<\/h3>\n\n\n<p>Heavy CPU work, lots of queued tasks, or a busy event loop can delay timer callbacks. Expect drift under load. If accuracy matters, check <code>Date.now()<\/code> or <code>performance.now()<\/code> and adjust.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n<h3 class=\"wp-block-heading\" id=\"how-do-i-wait-1-second-in-javascript\">How do I wait 1 second in JavaScript?<\/h3>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">setTimeout(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">\"after 1 second\"<\/span>);\n}, <span class=\"hljs-number\">1000<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<h3 class=\"wp-block-heading\" id=\"how-do-i-sleep-1-second-in-javascript-using-asyncawait\">How do I sleep 1 second in JavaScript using async\/await?<\/h3>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> delay = <span class=\"hljs-function\">(<span class=\"hljs-params\">ms<\/span>) =&gt;<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Promise<\/span>(<span class=\"hljs-function\">(<span class=\"hljs-params\">r<\/span>) =&gt;<\/span> setTimeout(r, ms));\n\n<span class=\"hljs-keyword\">await<\/span> delay(<span class=\"hljs-number\">1000<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<h3 class=\"wp-block-heading\" id=\"does-javascript-have-a-builtin-sleep-function\">Does JavaScript have a built-in sleep() function?<\/h3>\n\n\n<p>No built-in <code>sleep()<\/code> for browsers. You typically use <code>setTimeout<\/code> or await a Promise-based <code>delay()<\/code>. Blocking \u201csleep loops\u201d exist, but they freeze the UI and are a bad idea.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"how-do-i-wait-1-second-in-nodejs\">How do I wait 1 second in Node.js?<\/h3>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> { setTimeout } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"node:timers\/promises\"<\/span>;\n<span class=\"hljs-keyword\">await<\/span> setTimeout(<span class=\"hljs-number\">1000<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<h3 class=\"wp-block-heading\" id=\"why-does-settimeout-not-pause-the-code\">Why does setTimeout not pause the code?<\/h3>\n\n\n<p><code>setTimeout<\/code> schedules your callback for later and returns immediately. JavaScript keeps running the next lines while the timer counts down.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"why-is-my-settimeout-slower-in-a-background-tab\">Why is my setTimeout slower in a background tab?<\/h3>\n\n\n<p>Browsers throttle background tabs. Timers get clamped so they fire less often to save resources, which makes 1000ms delays less reliable.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"how-do-i-test-settimeout-without-waiting-in-jest\">How do I test setTimeout without waiting in Jest?<\/h3>\n\n\n<p>Use fake timers and advance time instantly.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">jest.useFakeTimers();\n\ntest(<span class=\"hljs-string\">\"waits 1 second\"<\/span>, () =&gt; {\n  <span class=\"hljs-keyword\">const<\/span> fn = jest.fn();\n\n  setTimeout(fn, <span class=\"hljs-number\">1000<\/span>);\n  jest.advanceTimersByTime(<span class=\"hljs-number\">1000<\/span>);\n\n  expect(fn).toHaveBeenCalled();\n});\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<h2 class=\"wp-block-heading\" id=\"testing-how-to-handle-waits-in-jest\">Testing, how to handle waits in Jest<\/h2>\n\n<h3 class=\"wp-block-heading\" id=\"use-fake-timers-instead-of-real-1second-waits\">Use fake timers instead of real 1-second waits<\/h3>\n\n\n<p>Real 1-second waits make tests slow and flaky. Fake timers make timing deterministic.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">jest.useFakeTimers();\n\ntest(<span class=\"hljs-string\">\"waits 1 second\"<\/span>, () =&gt; {\n  <span class=\"hljs-keyword\">const<\/span> fn = jest.fn();\n\n  setTimeout(fn, <span class=\"hljs-number\">1000<\/span>);\n  jest.advanceTimersByTime(<span class=\"hljs-number\">1000<\/span>);\n\n  expect(fn).toHaveBeenCalledTimes(<span class=\"hljs-number\">1<\/span>);\n});\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<h3 class=\"wp-block-heading\" id=\"testing-asyncawait-delay\">Testing async\/await delay()<\/h3>\n\n\n<p>Advance timers, then let pending microtasks run before asserting.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">const<\/span> delay = <span class=\"hljs-function\">(<span class=\"hljs-params\">ms<\/span>) =&gt;<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Promise<\/span>(<span class=\"hljs-function\">(<span class=\"hljs-params\">r<\/span>) =&gt;<\/span> setTimeout(r, ms));\n\njest.useFakeTimers();\n\ntest(<span class=\"hljs-string\">\"await delay(1000) resolves\"<\/span>, <span class=\"hljs-keyword\">async<\/span> () =&gt; {\n  <span class=\"hljs-keyword\">const<\/span> done = jest.fn();\n\n  <span class=\"hljs-keyword\">const<\/span> p = <span class=\"hljs-function\">(<span class=\"hljs-params\"><span class=\"hljs-keyword\">async<\/span> (<\/span>) =&gt;<\/span> {\n    <span class=\"hljs-keyword\">await<\/span> delay(<span class=\"hljs-number\">1000<\/span>);\n    done();\n  })();\n\n  jest.advanceTimersByTime(<span class=\"hljs-number\">1000<\/span>);\n  <span class=\"hljs-keyword\">await<\/span> <span class=\"hljs-built_in\">Promise<\/span>.resolve();\n  <span class=\"hljs-keyword\">await<\/span> p;\n\n  expect(done).toHaveBeenCalled();\n});\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion, pick the right approach<\/h2>\n\n\n<p>For \u201cjavascript wait 1 second\u201d, use a non-blocking delay.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Need async\/await? Use <code>await delay(1000)<\/code><\/li><li>Need callback-based code? Use <code>setTimeout(() =&gt; { ... }, 1000)<\/code><\/li><li>In Node 15+? Use <code>node:timers\/promises<\/code> and <code>await setTimeout(1000)<\/code><\/li><li>Avoid busy-wait loops, they freeze the page<\/li><\/ul>\n\n\n\n<p><strong>CTA:<\/strong> Copy the <code>delay()<\/code> helper from above and use <code>await delay(1000)<\/code> as your default pattern.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"related-articles\">Related articles<\/h2>\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/alvarotrigo.com\/blog\/learn-javascript\/\">How long does it take to learn JavaScript?<\/a><\/li><li><a href=\"https:\/\/alvarotrigo.com\/blog\/disable-button-javascript\/\">How to Disable a Button in JavaScript<\/a><\/li><li><a href=\"https:\/\/alvarotrigo.com\/blog\/move-cursor-to-end-input\/\">Move cursor to the end of input using JavaScript<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Wait 1 second in JavaScript (1000ms) with setTimeout or async\/await. Copy-paste snippets for browser and Node.js, plus pitfalls and testing.<\/p>\n","protected":false},"author":1,"featured_media":5817,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[107],"tags":[9,10],"class_list":["post-5818","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-css","tag-javascript"],"acf":[],"_links":{"self":[{"href":"https:\/\/alvarotrigo.com\/blog\/wp-json\/wp\/v2\/posts\/5818","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alvarotrigo.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alvarotrigo.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alvarotrigo.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alvarotrigo.com\/blog\/wp-json\/wp\/v2\/comments?post=5818"}],"version-history":[{"count":10,"href":"https:\/\/alvarotrigo.com\/blog\/wp-json\/wp\/v2\/posts\/5818\/revisions"}],"predecessor-version":[{"id":19649,"href":"https:\/\/alvarotrigo.com\/blog\/wp-json\/wp\/v2\/posts\/5818\/revisions\/19649"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alvarotrigo.com\/blog\/wp-json\/wp\/v2\/media\/5817"}],"wp:attachment":[{"href":"https:\/\/alvarotrigo.com\/blog\/wp-json\/wp\/v2\/media?parent=5818"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alvarotrigo.com\/blog\/wp-json\/wp\/v2\/categories?post=5818"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alvarotrigo.com\/blog\/wp-json\/wp\/v2\/tags?post=5818"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}