اكتشاف مؤقتات جافا سكريبت
setTimeout()
عند كتابة كود جافا سكريبت، قد ترغب في تأخير تنفيذ دالة.
هذه هي وظيفة setTimeout
. تحدد دالة مُنعكس (callback) لتنفيذها لاحقًا، وقيمة تعبر عن متى تريد تشغيلها لاحقًا، بالمللي ثانية:
setTimeout(() => {
// يتم التشغيل بعد 2 ثانية
}, 2000)
setTimeout(() => {
// يتم التشغيل بعد 50 مللي ثانية
}, 50)
يُعرّف هذا التركيب دالة جديدة. يمكنك استدعاء أي دالة أخرى تريدها هناك، أو يمكنك تمرير اسم دالة موجودة، ومجموعة من المعلمات:
const myFunction = (firstParam, secondParam) => {
// افعل شيئًا ما
}
// يتم التشغيل بعد 2 ثانية
setTimeout(myFunction, 2000, firstParam, secondParam)
ترجع setTimeout
معرف المُؤقت. لا يُستخدم هذا بشكل عام، ولكن يمكنك تخزين هذا المعرف، ومسحه إذا كنت تريد حذف تنفيذ الدالة المجدولة هذا:
const id = setTimeout(() => {
// يجب أن يتم التشغيل بعد 2 ثانية
}, 2000)
// غيرت رأيي
clearTimeout(id)
تأخير صفري
إذا قمت بتحديد تأخير وقت الانتظار إلى 0، فسيتم تنفيذ دالة المُنعكس في أقرب وقت ممكن، ولكن بعد تنفيذ الدالة الحالية:
setTimeout(() => {
console.log('بعد ')
}, 0)
console.log('قبل ')
سيطبع هذا الكود
قبل
بعد
هذا مفيد بشكل خاص لتجنب حجب وحدة المعالجة المركزية في المهام المكثفة والسماح بتنفيذ دوال أخرى أثناء إجراء حساب مكثف، عن طريق وضع الدوال في قائمة الانتظار في المُجدول.
TIP
تقوم بعض المتصفحات (IE و Edge) بتنفيذ طريقة setImmediate()
التي تقوم بنفس الوظائف بالضبط، لكنها ليست قياسية و غير متوفرة على متصفحات أخرى. لكنها دالة قياسية في Node.js.
setInterval()
setInterval
هي دالة مشابهة لـ setTimeout
، مع اختلاف: بدلاً من تشغيل دالة المُنعكس مرة واحدة، ستقوم بتشغيلها إلى الأبد، في فاصل زمني محدد (بالمللي ثانية):
setInterval(() => {
// يتم التشغيل كل 2 ثانية
}, 2000)
يتم تشغيل الدالة أعلاه كل 2 ثانية ما لم تُخبره بالتوقف، باستخدام clearInterval
، ومرور معرف الفاصل الزمني الذي أعادته setInterval
:
const id = setInterval(() => {
// يتم التشغيل كل 2 ثانية
}, 2000)
// غيرت رأيي
clearInterval(id)
من الشائع استدعاء clearInterval
داخل دالة مُنعكس setInterval
، للسماح لها بتحديد ما إذا كان يجب تشغيلها مرة أخرى أو التوقف. على سبيل المثال، يقوم هذا الكود بتشغيل شيء ما ما لم يكن لدى App.somethingIWait القيمة وصلت:
setTimeout
التكراري
تبدأ الدالة setInterval
دالة كل n مللي ثانية، دون أي اعتبار لوقت انتهاء تنفيذ الدالة.
إذا استغرقت الدالة نفس المدة الزمنية دائمًا، فكل شيء على ما يرام.
ربما تستغرق الدالة أوقات تنفيذ مختلفة، اعتمادًا على ظروف الشبكة.
وربما يتداخل تنفيذ طويل مع التنفيذ التالي.
لتجنب ذلك، يمكنك جدولة setTimeout
تكراري ليتم استدعاؤه عند انتهاء دالة الاستدعاء:
const myFunction = () => {
// القيام بشيء ما
setTimeout(myFunction, 1000)
}
setTimeout(myFunction, 1000)
تتوفر الدالتان setTimeout
و setInterval
في Node.js، من خلال وحدة المؤقتات.
يوفر Node.js أيضًا setImmediate()
، وهو ما يعادل استخدام setTimeout(() => {}, 0)
، ويستخدم في الغالب للعمل مع حلقة أحداث Node.js.