البرمجة

تأخير استرجاع الوعود في JavaScript

في هذا الكود، يتم استخدام دالة setTimeout لتأخير استرجاع الوعد الثاني بعد فترة زمنية معينة. ولكن المشكلة تكمن في كيفية التعامل مع دالة setTimeout في سياق استخدامها داخل سلسلة الوعود (Promises chain).

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

ببساطة، الكود يتبع تسلسل معين:

  1. يتم جلب الروابط من الملف المسمى ‘links.txt’.
  2. بعد ذلك، يتم جلب محتوى الرابط الأول من الروابط المسترجعة.
  3. تُكتب هذه المحتويات إلى الصفحة على الفور باستخدام الدالة writeToBody().
  4. بعد ذلك، يتم استخدام setTimeout لتأخير استرجاع محتوى الرابط الثاني لمدة زمنية 1000 ميلي ثانية.
  5. بعد انقضاء مدة الانتظار، يتم استرجاع محتوى الرابط الثاني.

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

إليك كيف يمكن تعديل الكود لحل هذه المشكلة:

javascript
getLinks('links.txt').then(function(links){ let all_links = JSON.parse(links); globalObj = all_links; return getLinks(globalObj["one"] + ".txt"); }).then(function(topic){ writeToBody(topic); // استخدام setTimeout داخل دالة Promise.resolve لضمان استرجاع الوعد بعد انتهاء وقت الانتظار return new Promise(function(resolve, reject) { setTimeout(function() { resolve(getLinks(globalObj["two"] + ".txt")); }, 1000); }); }).then(function(secondTopic) { // يتم استخدام الثاني عند الانتهاء من استرجاع محتوى الرابط الثاني writeToBody(secondTopic); }).catch(function(error){ // التعامل مع الأخطاء هنا إذا حدثت في أي نقطة من سلسلة الوعود console.error(error); });

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

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

بمجرد تغيير الكود كما هو موضح أعلاه، يصبح من الممكن تنفيذ عمليات استرجاع البيانات بنجاح داخل سلسلة الوعود. لكن دعنا نتعمق قليلاً في السبب الذي أدى إلى حدوث المشكلة الأصلية وكيف يتم حلها.

السبب الرئيسي وراء حدوث الخطأ الذي ذكرته في البداية هو أن استخدام setTimeout داخل دالة التحليل (then) لا يعيد الوعد بشكل مباشر. بدلاً من ذلك، يعتبر التأخير داخل setTimeout ببساطة كوداً يتم تنفيذه في وقت لاحق.

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

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

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

مقالات ذات صلة

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

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر