لغة جافاسكريبت، كونها أحادية الخيط، تفتقر إلى ما يعادل مباشرةً دالة sleep()
الموجودة في لغات البرمجة الأخرى. ويتطلب محاكاة الإيقاف المؤقت استخدام تقنيات غير متزامنة. وتستعرض هذه المقالة طريقتين: إحداهما باستخدام setTimeout
والوعود، والأخرى تعتمد على بناء جملة async/await
الأنظف.
جدول المحتويات
تنفيذ دالة Sleep باستخدام الوعود
الطريقة الأكثر مباشرةً تستخدم setTimeout
داخل وعد. وهذا يتجنب حجب الخيط الرئيسي، مما يضمن استجابة تطبيقك.
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
sleep(2000)
.then(() => console.log("تم الانتظار لمدة ثانيتين!"))
.catch(error => console.error("حدث خطأ:", error));
console.log("سيتم تنفيذ هذا قبل اكتمال دالة sleep.");
شرح:
sleep(ms)
: تأخذ هذه الدالة مدة الانتظار بالمللي ثانية (ms
) كوسيط.new Promise(resolve => setTimeout(resolve, ms))
: يتم إنشاء وعد.setTimeout
يحدد موعدًا لدالةresolve
ليتم استدعاؤها بعدms
مللي ثانية. وهذا يحل الوعد، مشيرًا إلى نهاية فترة الانتظار..then()
: هذا يعالج الوعد المحل، حيث ينفذ الكود بداخله بعد اكتمال فترة الانتظار..catch()
: هذا القسم الاختياري يعالج أي أخطاء قد تحدث أثناء مهلة الوقت.
هذه الطريقة فعالة وتتجنب عيوب حجب الخيط الرئيسي. ومع ذلك، قد يبدو استخدام .then()
أقل وضوحًا لبعض المبرمجين.
تنفيذ دالة Sleep باستخدام Async/Await
يوفر Async/Await حلاً أكثر قابلية للقراءة وأكثر أناقة. وهو يعتمد على النهج القائم على الوعود ولكنه يبسط التدفق غير المتزامن.
async function sleep(ms) {
await new Promise(resolve => setTimeout(resolve, ms));
}
async function myFunction() {
console.log("بدء...");
await sleep(2000);
console.log("تم الانتظار لمدة ثانيتين!");
}
myFunction();
console.log("سيتم تنفيذ هذا قبل اكتمال دالة sleep.");
شرح:
async function sleep(ms)
: تشير كلمةasync
إلى دالة غير متزامنة.await new Promise(...)
: كلمةawait
توقّف تنفيذsleep
حتى يتم حل الوعد. هذا التوقف لا يحجب الخيط الرئيسي.async function myFunction()
: توضح هذه الدالة كيفية استخدامsleep
ضمن عملية غير متزامنة أكبر.
يجعل بناء جملة async/await
الكود غير المتزامن يبدو متزامنًا، مما يحسن القراءة والصيانة. وهذا هو النهج المفضل عمومًا لوضوحه وسهولة استخدامه.
تحقق كلا الطريقتين نفس النتيجة، لكن async/await
يوفر بناء جملة أكثر حداثة وقابلية للقراءة للتعامل مع العمليات غير المتزامنة في جافاسكريبت. تجنب حلقات الانتظار المشغولة في رمز الإنتاج؛ لأنها ستُجمّد تطبيقك.