Q41. What is the difference between setTimeout(), setInterval(), and requestAnimationFrame()?
তিনটি সময়-নির্ভর method-এর সময়, ব্যবহার ও সঠিক প্রয়োগ।
তিনটোই সময় বিলম্ব করে কাজ চালায়, কিন্তু কাজটা আলাদা। setTimeout একবার পরে চলে, setInterval বারবার চলে, আর requestAnimationFrame ব্রাউজারের প্রতিটি repaint-এর সঙ্গে সিঙ্ক করে চলে — এটি শুধু animation বা graphics-এর জন্য।
// setTimeout — একবার মাত্র
setTimeout(() => {
console.log("২ সেকেন্ড পর একবার");
}, 2000);
// setInterval — বারবার
let count = 0;
const id = setInterval(() => {
count++;
console.log("প্রতি ১ সেকেন্ডে:", count);
if (count === 3) {
clearInterval(id); // থামাতে হলে অবশ্যই বন্ধ করতে হবে
}
}, 1000);
// requestAnimationFrame — repaint অনুযায়ী
const box = document.getElementById("box");
let x = 0;
function animate() {
x += 2;
box.style.transform = `translateX(${x}px)`;
if (x < 200) {
requestAnimationFrame(animate);
}
}
requestAnimationFrame(animate);setTimeout শুধু একবার কাজ করে এবং setInterval চলতে থাকে। requestAnimationFrame চালানোর পর নিজেই নতুন করে callback রেজিস্টার করতে হয়, তাই animation বন্ধ করতে চাইলে আর frame request না দিয়ে শুধু ফাংশন ডাকা বন্ধ করলেই হয়।
সবচেয়ে গুরুত্বপূর্ণ পার্থক্য হলো নির্ভুলতা — setTimeout সঠিক সময়ে আসে এমন নিশ্চয়তা দেয় না, কারণ event loop-এ অন্য কাজ জড়িয়ে থাকলে সে দেরি করতে পারে।
// খারাপ উদাহরণ — প্রতি টাইপে অপেক্ষা করা
function search() {
const term = input.value;
setTimeout(() => {
const results = searchDatabase(term); // ধীর কাজ
render(results);
}, 300);
}
// ভালো উদাহরণ — কাজ শেষ হওয়ার পর পরেরটা শুরু
function search2() {
const term = input.value;
fetchResults(term).then((results) => {
setTimeout(() => {
render(results);
}, 300);
});
}graphics বা animation-এ setInterval ব্যবহার করলে চওড়া ঝাপটানো লাগতে পারে, কারণ repaint সবসময় ৬০fps-এ হয় না। তখন requestAnimationFrame ব্রাউজারের সঙ্গে সিঙ্ক করে সবসময় সঠিক সময়ে ছবি আঁকে।
// 60fps হলে প্রতি ফ্রেমে 5px, মোট 20 ফ্রেম = প্রায় 333ms
let x = 0;
function move() {
x += 5;
element.style.transform = `translateX(${x}px)`;
if (x < 100) requestAnimationFrame(move);
}
requestAnimationFrame(move);| বিষয় | setTimeout | setInterval | requestAnimationFrame |
|---|---|---|---|
| কতবার চলে | একবার | বারবার | প্রতিটি repaint-এ |
| শুধু browser-এ | নয় | নয় | হ্যাঁ |
| নিজে থেকে থামে | না | clearInterval দরকার | ডাকা বন্ধ করলেই থামে |
| সেরা ব্যবহার | নির্দিষ্ট সময় পরে | পুনরাবৃত্তি | animation ও graphics |
setTimeout বা setInterval দিয়ে কখনোই animation করবেন না — repaint-এর সঙ্গে সিঙ্ক না থাকায় ছবি কাঁপবে বা ধীর দেখাবে। আর setInterval ব্যবহার করলে clearInterval দিয়ে বন্ধ করার কথা ভুলবেন না, নয়তো page বন্ধ না হওয়া পর্যন্ত কাজ চলতে থাকবে।