البرمجة

إدارة حد الزمني في Async/Await باستخدام TypeScript

في بيئة Node.js مع TypeScript، يتم استخدام ميزة async/await لتنظيم العمليات الغير متزامنة بشكل أكثر قراءة وفهمًا. ومع ذلك، تواجه التحكم في الحد الزمني (timeout) تحديات إضافية، خاصةً عند استخدام دوال مثل setTimeout في هذا السياق.

لحل هذه المشكلة، يمكن استخدام ميزة الـ Promise.race لإنشاء سباق بين الوعود (Promises)، والتي يمكن أن تكون فعالة في تحديد الحد الزمني للدوال الطويلة. يمكن تنفيذ ذلك بشكل مشابه للكود التالي:

typescript
async function doSomethingInSeries() { // تعيين الحد الزمني للوظيفة بـ 3 ثواني const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), 3000) ); // تنظيم الوعود والحد الزمني باستخدام Promise.race const result = await Promise.race([ timeoutPromise, callApi().then(res1 => persistInDB(res1)), callApi().then(res1 => doHeavyComputation(res1)), ]); return result; } // التقاط الأخطاء بشكل منفصل doSomethingInSeries() .then(result => { // القيام بالعمليات اللازمة على النتيجة console.log(result); }) .catch(err => { // التعامل مع الأخطاء، بما في ذلك أخطاء الحد الزمني console.error(err.message); });

في هذا المثال، يتم إنشاء وعد (Promise) للحد الزمني باستخدام setTimeout ويتم استخدام Promise.race لتنظيم بين الوعود المختلفة، بما في ذلك الحد الزمني. إذا تم استكمال أي وظيفة قبل انتهاء الحد الزمني، يتم استكمال الوعد الذي يحصل على القيمة. وإذا انتهت المهلة الزمنية دون استكمال أي وظيفة، يتم رفض الوعد مع خطأ الحد الزمني.

هذا النهج يتيح لك التحكم في الحد الزمني بشكل أفضل والتعامل مع الأخطاء بشكل فعال.

المزيد من المعلومات

تتيح لغة TypeScript تحسين تنظيم الشيفرة في مشاريع Node.js، حيث يمكنك تحديد أنواع البيانات واستفادة من ميزات البرمجة الكائنية. في السياق الحالي، نستخدم async/await لجعل التفاعل مع الوعود أكثر قراءة وفهمًا.

الدالة doSomethingInSeries تمثل سلسلة من العمليات الغير متزامنة التي يتعامل معها البرنامج. باستخدام await، يتم تعليق تنفيذ الدالة حتى اكتمال كل وظيفة. ومع ذلك، يعتبر تحديد حد زمني لهذه العمليات أمرًا ذا أهمية خاصة، لتجنب انتظار طويل يؤثر على أداء التطبيق.

الكود يقوم بتعيين حد زمني باستخدام setTimeout ومن ثم يستخدم Promise.race لتحديد أي وظيفة ستتم أولاً – إما استكمال العمليات الفرعية أو رمي خطأ في حال تجاوز الحد الزمني. يتيح هذا النهج التحكم الفعّال في سير البرنامج وضمان أن العمليات لا تأخذ وقتًا زائدًا.

في الجزء الأخير من الكود، يتم التعامل مع النتائج أو الأخطاء المحتملة باستخدام .then و .catch على الوعد الناتج من doSomethingInSeries، مما يسمح بالتحكم الكامل في سير التنفيذ.

من الجدير بالذكر أن هذا النهج يعزز قابلية الصيانة وفهم الشيفرة، ويساهم في تقليل تأثير الأخطاء وتحسين أداء التطبيق.

زر الذهاب إلى الأعلى