خاتمة

أعلم أنها ربما كانت قراءة طويلة ولكن أعتقد أنك استمتعت بها. على أي حال، إذا كانت لديك أي أسئلة أو إذا كان لديك أي اقتراح، فلا تتردد في التواصل معي.

شكرًا لقراءتك وإلى اللقاء؟

","image":"http://www.luping.net/uploads/20240822/172428984466c6933405c14.gif","datePublished":"2024-08-22T09:24:04+08:00","dateModified":"2024-08-22T09:24:04+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لا تحتاج إلى ضبط المهلة

لا تحتاج إلى ضبط المهلة

تم النشر بتاريخ 2024-08-22
تصفح:324

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

قبل أن أبدأ في شرح فكرتي، لدي سؤال لك: هل يمكنك استخدام ساعة تعطي الوقت الخطأ؟

إذا كانت إجابتك بنعم، فأنا آسف لإضاعة وقتك الثمين لأن هذا المقال لا يخصك.

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

المشكلة مع هذه الوظائف

للبدء، دعونا نفكر في المقتطف التالي

 function test() {
   let i = 0;
   setTimeout(() => console.log("hello"), 0);
   while (i 


إذا قمت بتشغيل هذا المقتطف في وحدة تحكم المتصفح، فستحصل على النتيجة التالية

You don

يرجع هذا السلوك إلى حقيقة أن setTimeout يضيف رد الاتصال في قائمة انتظار المتصفح بحيث يجب معالجته بمجرد أن يكون خاملاً (ليس لديه مهمة للقيام بها) بمعنى آخر رد الاتصال تم تمريره إلى setTimeout له أولوية منخفضة

الآن، بعد معرفة ذلك، أتصور أنه سيكون من الصعب عليك تنفيذ المؤقتات باستخدام وظيفة setTimeout لأنه يمكن أن يكون لديك علامتين أو حتى 10 علامات (اعتمادًا على مدى انشغال متصفحك) في نفس الوقت. سيكون تصحيح الأخطاء بمثابة كابوس، لكن هل لدينا حل أفضل؟

طريقة لتجنب هذه الوظائف

لتوفير طريقة أفضل لتنفيذ المؤقتات، يجب علينا استخدام وظيفة requestAnimationFrame لأنها تطلب من المتصفح تنفيذ رد اتصال قبل الطلاء التالي (بمعنى آخر قبل حدوث أي تغيير في واجهة المستخدم)

الفرق هنا دقيق جدًا، لذا من الأفضل فهمه من خلال الكود. دعونا نستعيد مقتطفنا السابق ونعدله قليلاً لمقارنة setTimeout و requestAnimationFrame

function testWithAnimationFrame() {
  let i = 0;
  setTimeout(() => console.log("hello"), 0);
  requestAnimationFrame(() => console.log("tell me the next paint"));
  while (i 


في هذا المثال، يمكننا أن نرى أنه عند التشغيل على Chrome، يتم تشغيل setTimeout قبل requestAnimationFrame (على الرغم من حدوث العكس في بعض الحالات النادرة)

You don

ولكن إذا قمت بتشغيله على Firefox، فسيكون هذا هو الإخراج

You don

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

الآن إذا تمكنا من تعديل المقتطف الخاص بنا لجعل المتصفح يعيد رسم الصفحة، فلنرى ما سيحدث

function testWithAnimationFrame2() {
  let i = 0;
  setTimeout(() => console.log("hello"), 0);
  requestAnimationFrame(() => console.log("tell me the next paint"));
  while (i 


إليك الإخراج على Chrome

You don

وهنا هو الناتج في فايرفوكس

You don

كما ترون في السجلات، عندما يقوم المتصفح بإجراء تغييرات في واجهة المستخدم، ستكون لوظيفة requestAnimationFrame دائمًا الأولوية على عمليات الاسترجاعات المجدولة الأخرى.

نظرًا لأننا نجري عمليات إعادة طلاء باستمرار على الويب، فإن requestAnimationFrame يعد خيارًا واضحًا لتنفيذ المؤقتات.

فهم وظيفة requestAnimationFrame

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

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

تنفيذ بسيط لساعة الإيقاف في JavaScript

لتنفيذ ساعة توقيت، هناك بعض المتطلبات:

  • يجب أن نعرف بعد أي مقدار من الوقت يجب أن تظهر علامة (عادةً ثانية)
  • يجب أن نعرف التأخير الزمني الذي يجب أن تتوقف بعده ساعة الإيقاف عن الإشارة
  • يجب أن تكون الفترات الزمنية أقل من التأخير

مع أخذ كل هذه المتطلبات في الاعتبار، سيعمل مقتطف الكود التالي على إنشاء ساعة توقيت لك

خاتمة

أعلم أنها ربما كانت قراءة طويلة ولكن أعتقد أنك استمتعت بها. على أي حال، إذا كانت لديك أي أسئلة أو إذا كان لديك أي اقتراح، فلا تتردد في التواصل معي.

شكرًا لقراءتك وإلى اللقاء؟

بيان الافراج تم نشر هذه المقالة على: https://dev.to/jospinevans/you-dont-need-to-set-the-time-out-5bfo?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] للحذف هو - هي
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3