اگر با زبانهایی مثل Python، Java یا C++ کار کرده باشید، احتمالا با تابع sleep برای متوقف کردن موقت اجرای برنامه آشنا هستید. اما در جاوااسکریپت، به دلیل ماهیت غیرهمگام (Asynchronous) و تکرشتهای (Single-threaded) بودن آن، داستان کمی متفاوت است. در این مقاله بررسی میکنیم که چگونه میتوان یک توقف کنترلشده ایجاد کرد، بدون اینکه مشکلی برای تجربه کاربری و کارایی ایجاد کنیم.

راهحل مدرن و استاندارد
بهترین و تمیزترین روش برای شبیهسازی sleep در جاوااسکریپت مدرن، ترکیب Promise و setTimeout با سینتکس async/await است:
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
async function demo() {
console.log("شروع عملیات");
await sleep(2000); // توقف به مدت ۲ ثانیه
console.log("ادامه عملیات");
}
demo();
این روش به جای متوقف کردن کل اجرا، فقط اجرای تابع async فعلی را به تعویق میاندازد و حلقه رویداد را برای پردازش سایر وظایف آزاد میگذارد.
اگر در محیط Node.js (نسخه ۱۶ به بالا) کار میکنید، حتی نیازی به نوشتن این تابع ندارید و میتوانید از ماژول داخلی timers/promises استفاده کنید:
import { setTimeout } from 'timers/promises';
await setTimeout(2000);
چرا به Sleep نیاز داریم؟
شاید بپرسید چرا باید اجرای برنامه را متوقف کنیم؟
نیازهای رایج برنامهنویسی در این زمینه عبارتند از:
- کنترل نرخ درخواستها
جلوگیری از ارسال درخواستهای پشتسرهم به یک API برای جلوگیری از مسدود شدن توسط سرور. - مکانیزم تلاش مجدد
ایجاد تاخیر بین تلاشهای مجدد برای یک اتصال شبکه ناموفق، تا به سرور فرصت بازیابی داده شود. - شبیهسازی تاخیر شبکه
برای تست حالتهای Loading و اطمینان از پایداری کامپوننتها در مرحله توسعه فرانتاند.
اصول تجربه کاربری
اگر از روشهای اشتباه مثل حلقههای while توخالی برای ایجاد تاخیر استفاده کنید، مرورگر به حالت ناکارآمد میرود. کاربر نمیتواند روی چیزی کلیک کند، صفحه را پیمایش کند یا هیچ تعاملی با آن داشته باشد و این حس بدی به کاربر میدهد.
با استفاده از await، رابط کاربری پاسخگو میماند. همچنین از دیدگاه تجربه کاربری، ایجاد «تاخیر مصنوعی» در کد اصلی برای کاربر نهایی بهندرت توصیه میشود، مگر برای جلوگیری از پرش رابط کاربری. برای مثال اگر یک درخواست شبکه کمتر از ۲۰۰ میلیثانیه طول میکشد، نمایش و مخفی کردن فوری یک اسپینر (Spinner) باعث آزار چشم میشود. در این موارد، یک تاخیر کوتاه هوشمندانه میتواند تجربه روانتری ایجاد کند.
اصول کارایی در Sleep
از نظر کارایی، جاوااسکریپت بر پایه رویدادها کار میکند. تابع setTimeout یک تایمر را به محیط اجرا میسپارد و اجرای کد را بلافاصله ادامه میدهد. وقتی زمان به پایان برسد، تابع resolve به صف Callbackها اضافه میشود. این یعنی مصرف CPU در حین توقف نزدیک به صفر است.
برعکس، روشهای قدیمی یا اشتباه، هسته CPU را درگیر محاسبات بیهوده میکنند و باعث افزایش شدید مصرف باتری (بهویژه در دستگاههای موبایل) و کاهش کارایی کلی سیستم میشوند.
راهحلهای مدرن برای نیازهای متفاوت
پیادهسازی sleep در جاوااسکریپت نهتنها ممکن است، بلکه اگر با Promise و async/await انجام شود، با ساختار غیرهمگام این زبان هماهنگ است.
احتمالا در بسیاری از صفحات وب نیازی به Sleep مشابه کاربردهای زبانهای دیگر وجود ندارد ولی هنگامی که این گزینه را در اختیار داشته باشید، خلاقیت شما شکوفا میشود و کارهایی را انجام میدهید که خروجی آن جذابتر و موثرتر است.
