JavaScript Fundamentals

إيقافات غير متزامنة في جافا سكريبت: الوعود مقابل Async/Await

Spread the love

لغة جافاسكريبت، كونها أحادية الخيط، تفتقر إلى ما يعادل مباشرةً دالة 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 يوفر بناء جملة أكثر حداثة وقابلية للقراءة للتعامل مع العمليات غير المتزامنة في جافاسكريبت. تجنب حلقات الانتظار المشغولة في رمز الإنتاج؛ لأنها ستُجمّد تطبيقك.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *