সেটটাইমআউট বা সেটইন্টারওয়াল?


763

আমি যতদূর বলতে পারি, জাভাস্ক্রিপ্টের এই দুটি টুকরা একই রকম আচরণ করে:

বিকল্প একটি:

function myTimeoutFunction()
{
    doStuff();
    setTimeout(myTimeoutFunction, 1000);
}

myTimeoutFunction();

বিকল্প বি:

function myTimeoutFunction()
{
    doStuff();
}

myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);

সেটটাইমআউট এবং সেটইন্টারওয়াল ব্যবহারের মধ্যে কি কোনও পার্থক্য রয়েছে ?


6
আপনি যদি জেএসে টাইমারদের কীভাবে কাজ করেন সে সম্পর্কে কিছু ভাল বিবরণ চান, জন রেসিগ এই বিষয়ে একটি ভাল নিবন্ধ লিখেছিলেন
রাফায়েল

9
স্পষ্ট পার্থক্যও রয়েছে যে সেটটাইমআউটটির প্রচারের জন্য সেই অতিরিক্ত কোডের লাইন থাকা দরকার, যা রক্ষণাবেক্ষণের সমস্যা হওয়ার অপূর্ণতা রয়েছে তবে আপনাকে
পিরিয়ডটি


4
ধন্যবাদ @ জাপনপ্রো তবে সময়সীমার কাজ করতে সত্যিই আমার সমস্যা হয়নি। এই পোস্টটি ছিল কী পার্থক্য ছিল এবং কোনটি ব্যবহার করা উচিত।
দামোভিসা

উত্তর:


670

তারা মূলত একই জিনিসটি করার চেষ্টা করে তবে এপ্রোচটি পদ্ধতির setIntervalচেয়ে আরও সঠিক setTimeoutহবে, যেহেতু setTimeout1000ms অপেক্ষা করে, ফাংশনটি চালায় এবং তারপরে অন্য সময়সীমা নির্ধারণ করে। সুতরাং অপেক্ষা সময়টি আসলে 1000 মিমি থেকে কিছুটা বেশি (বা আপনার ফাংশনটি কার্যকর করতে দীর্ঘ সময় নিলে আরও অনেক কিছু)।

যদিও কেউ মনে করতে পারে যে এটি প্রতি 1000 মিমি ঠিক একইভাবে setIntervalকার্যকর করবে , তবে এটিও বিলম্বিত হবে তা লক্ষ করা গুরুত্বপূর্ণ , যেহেতু জাভাস্ক্রিপ্ট কোনও বহুমাত্রিক ভাষা নয়, যার অর্থ - যদি স্ক্রিপ্টের অন্যান্য অংশগুলি চলমান থাকে - অন্তরালে থাকবে এটি শেষ হওয়ার জন্য অপেক্ষা করা।setInterval

ইন এই বেহালার , আপনি স্পষ্টই দেখতে পাচ্ছো, সময়সীমার পিছনে পড়া হবে, যখন ব্যবধান প্রায় 1 কল / সেকেন্ড (যা স্ক্রিপ্ট করার চেষ্টা করা হয়) এ প্রায় সব সময়। আপনি যদি শীর্ষে গতির পরিবর্তনশীলটিকে 20 এর মতো ছোট কিছুতে পরিবর্তন করেন (যার অর্থ এটি প্রতি সেকেন্ডে 50 বার চালানোর চেষ্টা করবে), তবে বিরতিটি কখনই গড়ে প্রতি সেকেন্ডে 50 পুনরাবৃত্তির পরিমাণে পৌঁছায় না।

বিলম্ব প্রায় সর্বদা নগণ্য, তবে আপনি যদি সত্যই কিছু নির্দিষ্ট করে প্রোগ্রামিং করে থাকেন তবে আপনাকে একটি স্ব-সামঞ্জস্য করা টাইমারের জন্য যাওয়া উচিত (যা মূলত একটি সময়সীমা ভিত্তিক টাইমার যা এটি তৈরি হওয়া বিলম্বের জন্য নিয়মিত নিজেকে সামঞ্জস্য করে)


4
অ্যান্ডির অনুরূপ পরামর্শ ছিল। হাইপোথিটিক্যালি, এর অর্থ কি এই যে যদি পদ্ধতিটি কার্যকর করতে 1000 মিমিরও বেশি সময় নেয় তবে আপনার এক সাথে একাধিক চলতে পারে?
দামোভিসা 13

14
তাত্ত্বিকভাবে, হ্যাঁ অনুশীলনে, যেহেতু জাভাস্ক্রিপ্ট মাল্টিথ্রেডিং সমর্থন করে না। যদি আপনার কোডটি 1000 মিমি থেকে বেশি সময় নেয় তবে এটি ব্রাউজারকে হিমশীতল করবে।
কামিল ওয়ানরুইজ 13

61
টেকনিক্যালি, কোড এক্সিকিউট অভ্যস্ত ঠিক যে 1000ms, যেহেতু এটি টাইমার রেজল্যুশন করছি এবং কখন অন্যান্য কোড ইতিমধ্যেই নির্বাহ করা হয় নির্ভর করে। আপনার বক্তব্য এখনও দাঁড়িয়ে।
ম্যাথু ক্রামলে

10
সেটআইন্টারওয়াল দুটি উপায়ে আলাদা, 1। সেটইন্টারওয়াল পুনরাবৃত্ত হয় না এবং সেটটাইমআউট প্রথমবার আপনার ফাংশনটি কল করার সময় প্রথমে সেট টাইমআউটকে প্রথমবারের মতো কোনও দেরি না করে ডাকা হয় এবং তারপরে এটি সময়কালের পরে আবার কল করবে। প্রথম ফাঁসি কার্যকর হওয়ার পরে তারা প্রায় একই কাজ করে।
হাফিজ

5
পার্থক্য হ'ল সেটটাইমআউট নিজেই পুনরাবৃত্তি করে না। এটি আপনাকে একটি নির্দিষ্ট সময়ের পরে কোনও স্ক্রিপ্ট চালানোর অনুমতি দেয় তবে কেবল একবার। অন্যদিকে সেটআইন্টারওয়াল সেই স্ক্রিপ্টটির পুনরাবৃত্তি করবে, যতক্ষণ না এটি ক্লিয়ারটাইমআউট () দিয়ে বন্ধ হয়ে যায়।
লিয়েন্ডার

648

কোন পার্থক্য আছে?

হ্যাঁ. একটি টাইমআউট সেটটাইমআউট () বলা হওয়ার পরে একটি নির্দিষ্ট পরিমাণ সময় নির্বাহ করে; পূর্ববর্তী বিরতি বহিস্কারের পরে একটি বিরতি একটি নির্দিষ্ট সময় নির্বাহ করে।

আপনার doStuff () ফাংশনটি কার্যকর করতে কিছুক্ষণ সময় নিলে আপনি পার্থক্যটি লক্ষ্য করবেন। উদাহরণস্বরূপ, যদি আমরা সেটটাইমআউট / সেটইন্টারওয়ালার সাথে একটি কল উপস্থাপন করি ., সাথে টাইমআউট / ইন্টারভেল *এবং জাভাস্ক্রিপ্ট কোড এক্সিকিউশন এর সাথে একটি ফায়ারিং [-----]টাইমলাইনগুলি এর মত দেখাচ্ছে:

Timeout:

.    *  .    *  .    *  .    *  .
     [--]    [--]    [--]    [--]

Interval:

.    *    *    *    *    *    *
     [--] [--] [--] [--] [--] [--]

পরের জটিলতাটি যদি জাভাস্ক্রিপ্ট ইতিমধ্যে কিছু করতে ব্যস্ত থাকে তবে অন্তর অন্তর জ্বলজ্বল করে (যেমন একটি পূর্ববর্তী বিরতি পরিচালনা করা)। এই ক্ষেত্রে, অন্তরটি স্মরণ করা হয় এবং পূর্ববর্তী হ্যান্ডলারটি ব্রাউজারে নিয়ন্ত্রণটি ফিরে আসার সাথে সাথে ঘটে। সুতরাং উদাহরণস্বরূপ একটি doStuff () প্রক্রিয়া যা কখনও কখনও ছোট ([-]) এবং কখনও কখনও দীর্ঘ ([-----]) হয়:

.    *    *        *        *    *
     [-]  [-----][-][-----][-][-]  [-]

একটি বিরতি ফায়ারিং প্রতিনিধিত্ব করে যা সরাসরি তার কোডটি কার্যকর করতে পারে না এবং পরিবর্তে মুলতুবি করা হয়েছিল।

তাই ব্যবধানগুলি সময়সূচীতে ফিরে পেতে 'ধরতে' চেষ্টা করে। তবে, তারা একে অপরের শীর্ষে একটি সারি তৈরি করে না: বিরতিতে কেবলমাত্র একবার কার্যকর করা কার্যকর হতে পারে। (যদি তারা সকলেই সারিবদ্ধ থাকে, তবে ব্রাউজারটি বকেয়া ফাঁসি কার্যকর করার তালিকা বর্ধিত হবে!)

.    *            x            x
     [------][------][------][------]

এক্স একটি বিরতি ফায়ারিং প্রতিনিধিত্ব করে যা কার্যকর করা যায় না বা মুলতুবি করা যায় না, সুতরাং পরিবর্তে তা বাতিল করা হয়েছিল।

যদি আপনার doStuff () ফাংশনটি অভ্যাসগতভাবে এর জন্য নির্ধারিত অন্তরালের চেয়ে কার্যকর করতে বেশি সময় নেয় তবে ব্রাউজারটি এটি পরিসেবা করার চেষ্টা করে 100% সিপিইউ খাবে এবং কম প্রতিক্রিয়াশীল হতে পারে।

আপনি কোনটি ব্যবহার করেন এবং কেন?

চেইনড-টাইমআউট ব্রাউজারে ফ্রি সময়ের একটি গ্যারান্টিযুক্ত স্লট দেয়; ইন্টারভাল ব্রাউজার ইউআই উপলভ্যতার ব্যয়ে, নির্ধারিত সময়ে যতটা সম্ভব সঞ্চালিত হয় তার কার্যকারিতাটি নিশ্চিত করার চেষ্টা করে।

আমি ওয়ান-অফ অ্যানিমেশনগুলির জন্য একটি বিরতি বিবেচনা করব আমি যতটা সম্ভব মসৃণ হতে চেয়েছিলাম, যখন শৃঙ্খলিত সময়সীমা চলমান অ্যানিমেশনগুলির জন্য আরও নম্র হয় যা পৃষ্ঠাটি লোড হওয়া অবস্থায় থাকে all কম চাহিদাযুক্ত ব্যবহারের জন্য (যেমন প্রতি 30 সেকেন্ড বা কোনও কিছুতে তুচ্ছ আপডেটেডর গুলি চালানো), আপনি নিরাপদে ব্যবহার করতে পারেন।

ব্রাউজারের সামঞ্জস্যের ক্ষেত্রে, সেটটাইমআউট সেট ইনটারওয়ালটির পূর্বাভাস দেয় তবে আজ আপনি যে সমস্ত ব্রাউজার মিলবেন সেগুলি উভয়ই সমর্থন করে। বহু বছর ধরে শেষ স্ট্রাগলারটি উইনমো <6.5 এ আইই মোবাইল ছিল তবে আশা করি এটিও এখন আমাদের পিছনে।


তবে ইন্টারভাল এবং টাইমআউটগুলির মধ্যে পছন্দনীয় কারণগুলি কি সত্যই ব্রাউজারবিহীন প্ল্যাটফর্মকে ধরে রাখে, যেমন ওয়েবওএস বা জিলের মতো?
ভিড এল

2
বেনাম ফাংশনগুলিতে শৃঙ্খলাবদ্ধ সময়সীমা করার একটি দুর্দান্ত উপায়: সেটটাইমআউট (ফাংশন () {সেটটাইমআউট (আর্গুমেন্টস ক্যালি, 10)}, 10)
জাস্টিন মেয়ার

1
ব্রাউজারের সামঞ্জস্যের ক্ষেত্রে, যদিও সমস্ত ব্রাউজার উভয় পদ্ধতি সরবরাহ করে, তাদের কার্য সম্পাদন আলাদা।
unigg

"তবে তার সম্ভাবনা হ'ল এটি আপনি যে কোনও কিছুই ব্যবহার করছেন তা সমর্থন করে না" এতই সত্য
বেসিক

1
ক্রোমিয়াম প্রকল্প দ্বারা ড্রট মেশিন সেটটাইমআউট ("শিডিয়ুল ()", 0) ব্যবহার করে; তাই ক্রোম বা সংস্থার অভাবের জন্য ব্যাকগ্রাউন্ড ট্যাব থাকা অবস্থায় ব্রাউজারে অপ্রয়োজনীয় স্ট্যাক থাকবে না।
এলিয়ট ইয়াপ

90

setInterval ()

setInterval()একটি সময় অন্তর ভিত্তিক কোড সম্পাদন পদ্ধতি যা অন্তর শেষ হয়ে গেলে বারবার নির্দিষ্ট স্ক্রিপ্ট চালানোর নেটিভ ক্ষমতা থাকে। এটি করা উচিত নয় , স্ক্রিপ্ট লেখক দ্বারা তার কলব্যাক ফাংশন মধ্যে নেস্টেড করা এটি লুপ করতে যেহেতু এটি ডিফল্টরূপে loops । আপনি কল না করলে এটি বিরতিতে গুলি চালিয়ে যাবে clearInterval()

আপনি যদি অ্যানিমেশনগুলির জন্য বা একটি ক্লক টিকটিতে লুপ কোড করতে চান তবে ব্যবহার করুন setInterval()

function doStuff() {
    alert("run your code here when time interval is reached");
}
var myTimer = setInterval(doStuff, 5000);

setTimeout ()

setTimeout()একটি সময় ভিত্তিক কোড এক্সিকিউশন পদ্ধতি যা অন্তর্বর্তী পৌঁছে গেলে কেবল একবার স্ক্রিপ্ট কার্যকর করে । এটি পুনরায় পুনরুদ্ধার করবে না আপনি যদি স্ক্রিপ্টটি লুপ করতে গিয়ার না করেন তবে setTimeout()এটি চালনার জন্য যে ফাংশনটি কল করতে কল করে তার ভিতরে বাসা বাঁধে । লুপের দিকে মনোযোগ দিলে, আপনি কল না করলে এটি বিরতিতে গুলি চালিয়ে যাবে clearTimeout()

function doStuff() {
    alert("run your code here when time interval is reached");
}
var myTimer = setTimeout(doStuff, 5000);

আপনি যদি নির্দিষ্ট সময়ের পরে একসময় কিছু ঘটতে চান তবে ব্যবহার করুন setTimeout()। কারণ এটি নির্দিষ্ট সময় অন্তর যখন পৌঁছায় কেবল তখনই একটি সময় কার্যকর করে।


6
সুন্দর ব্যাখ্যা তবে নোট করুন যে ওপি প্রদত্ত উদাহরণগুলির মধ্যে মূল পার্থক্যটি বোঝে। বিশেষত, নোট করুন যে ওপির setTimeout()উদাহরণে setTimeout()তাকে পুনরাবৃত্তভাবে বলা হয় , যদিও setInterval()তা হয় না।
ডেভিডআরআর

44

সেটইন্টারভাল আপনার কোডের ভবিষ্যতের সম্পাদন বাতিল করা সহজ করে তোলে। আপনি যদি সেটটাইমআউট ব্যবহার করেন তবে পরবর্তী সময়ে যদি আপনি এটি বাতিল করতে চান তবে আপনাকে অবশ্যই টাইমার আইডিটি ট্র্যাক করে রাখতে হবে।

var timerId = null;
function myTimeoutFunction()
{
    doStuff();
    timerId = setTimeout(myTimeoutFunction, 1000);
}

myTimeoutFunction();

// later on...
clearTimeout(timerId);

বনাম

function myTimeoutFunction()
{
    doStuff();
}

myTimeoutFunction();
var timerId = setInterval(myTimeoutFunction, 1000);

// later on...
clearInterval(timerId);

35
আপনি কীভাবে সেট ইনটারওয়ালটির ক্ষেত্রে টাইমার আইডির ট্র্যাক রাখছেন না তা আমি দেখছি না। এটি কেবল ফাংশন থেকে টেনে আনা হয়েছে।
কেকোয়া

1
setTimeoutআইডি সংরক্ষণ করার পরিবর্তে অন্য বিকল্পটি হ'ল ifকিছু শর্ত সত্য হলে কেবলমাত্র পরবর্তী সময়সীমা সেট করতে একটি বিবৃতি যুক্ত করুন ।
nnnnnn

7
কেকোয়া, ভাল পয়েন্ট। তবে আপনাকে কেবল একবার বিরতি আইডি সংরক্ষণ করতে হবে। সময়সীমা আইডি সম্ভবত প্রতিটি অনুরোধের সাথে পরিবর্তিত হচ্ছে, সুতরাং আপনাকে এই পরিবর্তনগুলি লক্ষ্য রাখতে হবে । সময়সীমাটি সাফ করতে চায় এমন কোডের কোনও কোনওরকমে এই ভেরিয়েবলের বর্তমান মানটি অ্যাক্সেস করতে হবে। অতিরিক্তভাবে চলার সময়সীমাটি সাফ করা অসম্ভব doStuffকারণ আইডিটি অবৈধ। তবে, টাইমআউট আইডিগুলি সংরক্ষণ করার জন্য এটি সত্যিই প্রয়োজনীয় নয়। পরিবর্তে আপনি কেবল কল করা বন্ধ করতে পারেন setTimeout
রবার্ট

4
আমার অভিজ্ঞতায় আপনি বেশিরভাগ সময় সেটটাইমআউট ব্যবহার করার সময় বাতিল করতে সক্ষম হতে চান। সময় আপনি বাতিল করতে চান 99% সামনে পরবর্তী আবাহন, ঘটে না পরে পরের এক শেষ।
কামিল ওয়ানরুইজ

23

আমি খুঁজে setTimeoutযদি আপনি সময়সীমার বাতিল করতে চান ব্যবহার করা আরো সহজ পদ্ধতি:

function myTimeoutFunction() {
   doStuff();
   if (stillrunning) {
      setTimeout(myTimeoutFunction, 1000);
   }
}

myTimeoutFunction();

এছাড়াও, যদি ফাংশনে কিছু ভুল হয়ে যায় তবে এটি প্রতি সেকেন্ডে ত্রুটিটি পুনরাবৃত্তি করার পরিবর্তে প্রথম বারের ত্রুটিতে পুনরাবৃত্তি করা বন্ধ করে দেবে।


20

খুব পার্থক্য তাদের উদ্দেশ্য হয়।

setInterval()
   -> executes a function, over and over again, at specified time intervals  

setTimeout()
   -> executes a function, once, after waiting a specified number of milliseconds

এটা ঐটার মতই সহজ

এখানে আরও বিশদ বিবরণ http://javascript.info/tutorial/settimeout-setinterval


7
সুন্দর সংক্ষিপ্ত ব্যাখ্যা তবে নোট করুন যে ওপি প্রদত্ত উদাহরণগুলির মধ্যে মৌলিক পার্থক্যটি বোঝে। বিশেষত, নোট করুন যে ওপির setTimeout()উদাহরণে setTimeout()তাকে পুনরাবৃত্তভাবে বলা হয় , যদিও setInterval()তা হয় না।
ডেভিডআরআর

14

আপনি যখন সেটআইন্টারভাল এর ভিতরে কিছু ফাংশন চালান, যা টাইমআউট-> এর চেয়ে বেশি সময় কাজ করে- ব্রাউজার আটকে থাকবে।

- যেমন, doStuff () 1500 সেকেন্ড সময় নেয়। কার্যকর করতে হবে এবং আপনি যা করতে পারেন: setInterval (doStuff, 1000);
1) ব্রাউজারটি রান স্টাফ () যা 1.5 সেকেন্ড নেয় takes কার্যকর করা;
2) ~ 1 সেকেন্ডের পরে এটি আবার doStuff () চালানোর চেষ্টা করে । তবে পূর্ববর্তী ডো স্টাফ () এখনও কার্যকর করা হয়েছে- > তাই ব্রাউজার এই রানটিকে কাতারে যুক্ত করে ( প্রথমে কাজ শেষে চালানোর জন্য)।
৩,৪, ..) পরবর্তী পুনরাবৃত্তির জন্য মৃত্যুদন্ড কার্যকর করার সারিতে একই সংযোজন, তবে পূর্ববর্তী থেকে ডস স্টাফ () এখনও প্রগতিতে রয়েছে ...
ফলস্বরূপ- ব্রাউজারটি আটকে গেছে।

এই আচরণটি রোধ করতে, সর্বোত্তম উপায় হ'ল সেটটাইমআউটটি অনুকরণ করতে সেটটাইমআউটের ভিতরে সেটটাইমআউট চালানো ।
সেটটাইমআউট কলগুলির মধ্যে টাইমআউটগুলি সংশোধন করতে, আপনি জাভাস্ক্রিপ্টের সেটআইন্টারভাল প্রযুক্তিতে স্ব-সংশোধনকারী বিকল্পটি ব্যবহার করতে পারেন ।


1
আমি জানি না কেন এই উত্তরে কেউ কোনও মূল্য খুঁজে পায়নি!
রন্দিকা বিষ্মান

9

আমি সেটটাইমআউট ব্যবহার করি।

স্পষ্টতই পার্থক্যটি সেটটাইমআউট পদ্ধতিটিকে একবার কল করে, সেটইন্টারভাল তাকে পুনরাবৃত্তি করে।

পার্থক্যটি ব্যাখ্যা করার জন্য এখানে একটি ভাল নিবন্ধ: টিউটোরিয়াল: সেটটাইমআউট এবং সেটইন্টারভাল সহ জাভাস্ক্রিপ্ট টাইমার


2
হ্যাঁ, আমি এই পার্থক্যটি পেয়েছি, তবে আমি যে দুটি টুকরো কোড সরবরাহ করেছি তা একই জিনিস করা উচিত ...
দামোভিসা

উম্ম্ম হ্যাঁ ... আমি ভাবতাম ... তবে ডাকাটেন্ট এবং তার ভোট গণনা অনুসারে যা ঘটেছিল তা ঠিক নয়।
ব্র্যাভাক্স

9

আপনার কোডের বিভিন্ন কার্যকরকরণের উদ্দেশ্য থাকবে এবং কিছু প্রকল্পে যেমন অনলাইন গেম এটি গ্রহণযোগ্য নয়। প্রথমত, আপনার কোডটি একই উদ্দেশ্যগুলি দিয়ে কাজ করতে আপনার কী করা উচিত, আপনার "মাইটাইমআউট ফাংশন" এটিতে পরিবর্তন করা উচিত:

function myTimeoutFunction()
{
    setTimeout(myTimeoutFunction, 1000);
    doStuff();
}
myTimeoutFunction()

এই পরিবর্তনের পরে, এটি সমান হবে

function myTimeoutFunction()
{
    doStuff();
}
myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);

তবে, আপনার এখনও স্থির ফলাফল হবে না, কারণ জেএস একক থ্রেডযুক্ত। আপাতত, যদি জেএস থ্রেড কিছু নিয়ে ব্যস্ত থাকে, তবে এটি আপনার কলব্যাক ফাংশনটি কার্যকর করতে সক্ষম হবে না, এবং কার্যকরভাবে ২-৩ এমসিতে স্থগিত করা হবে। আপনার কি প্রতি সেকেন্ডে 60 জন মৃত্যুদন্ড কার্যকর করা হয়েছে এবং প্রতিবার আপনার এলোমেলোভাবে 1-3 সেকেন্ড বিলম্ব হলে তা একেবারেই গ্রহণযোগ্য হবে না (এক মিনিটের পরে এটি প্রায় 7200 ম্যাসি দেরি হয়ে যাবে), এবং আমি এই জাতীয় কিছু ব্যবহার করার পরামর্শ দিতে পারি:

    function Timer(clb, timeout) {
        this.clb = clb;
        this.timeout = timeout;
        this.stopTimeout = null;
        this.precision = -1;
    }

    Timer.prototype.start = function() {
        var me = this;
        var now = new Date();
        if(me.precision === -1) {
            me.precision = now.getTime();
        }
        me.stopTimeout = setTimeout(function(){
            me.start()
        }, me.precision - now.getTime() + me.timeout);
        me.precision += me.timeout;
        me.clb();
    };

    Timer.prototype.stop = function() {
        clearTimeout(this.stopTimeout);
        this.precision = -1;
    };

    function myTimeoutFunction()
    {
        doStuff();
    }

    var timer = new Timer(myTimeoutFunction, 1000);
    timer.start();

এই কোডটি স্থিতিশীল প্রয়োগের সময়কালের গ্যারান্টি দিবে। এমনকি থ্রেড ব্যস্ত থাকবে, এবং আপনার কোডটি 1005 ম্যাসেকেন্ডের পরে কার্যকর করা হবে, পরের বারেরটিতে এটি 995 এমসেকের সময়সীমা শেষ হবে এবং ফলাফল স্থিতিশীল থাকবে।


7

আমি এর সহজ পরীক্ষা করেছি setInterval(func, milisec), কারণ আমি জানতে আগ্রহী ছিলাম যে ফাংশন সময় গ্রহণের সময়সীমার চেয়ে বেশি হলে কী হয় happens

setIntervalসাধারণত পূর্ববর্তী পুনরাবৃত্তি শুরুর ঠিক পরের পুনরাবৃত্তির সময়সূচী তৈরি করবে , যদি না ফাংশনটি এখনও চলমান থাকে । যদি তা হয় setIntervalতবে ফাংশন শেষ হওয়া পর্যন্ত অপেক্ষা করতে হবে। এটি হওয়ার সাথে সাথে ফাংশনটি তাত্ক্ষণিকভাবে আবার বরখাস্ত করা হয় - তফসিল অনুসারে পরবর্তী পুনরাবৃত্তির জন্য অপেক্ষা করা হয় না (কারণ এটি সময় অতিক্রম না করে শর্তে থাকবে)। সমান্তরাল পুনরাবৃত্তি চলার সাথেও কোনও পরিস্থিতি নেই।

আমি এটি ক্রোম ভি 23 এ পরীক্ষা করেছি। আমি আশা করি এটি সমস্ত আধুনিক ব্রাউজার জুড়ে নির্ধারিত বাস্তবায়ন।

window.setInterval(function(start) {
    console.log('fired: ' + (new Date().getTime() - start));
    wait();
  }, 1000, new Date().getTime());

কনসোল আউটপুট:

fired: 1000    + ~2500 ajax call -.
fired: 3522    <------------------'
fired: 6032
fired: 8540
fired: 11048

waitফাংশন শুধু একটি থ্রেড ব্লক সাহায্যকারী হয় - সমলয় Ajax কল যা ঠিক লাগে 2500 মিলিসেকেন্ড সার্ভার সাইড এ প্রক্রিয়াকরণ:

function wait() {
    $.ajax({
        url: "...",
        async: false
    });
}

1
"সমান্তরাল পুনরাবৃত্তির সাথে চলমান পরিস্থিতি নেই" - হ্যাঁ, এটি অসম্ভব হওয়া উচিত। ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্টের একটি একক থ্রেডেড এক্সিকিউশন মডেল রয়েছে সুতরাং একই সময়ে কিছুই ঘটেনি (ইভেন্ট হ্যান্ডলারগুলি, ইত্যাদি)। যে কারণে সিঙ্ক্রোনাস আজাক্স কল চলাকালীন কিছুই হয় না (এবং ব্রাউজারটি প্রতিক্রিয়াহীন)।
মিঃ হোয়াইট

"অন্তর" এর মধ্যে কয়েকটি এমএসে ব্রাউজারটি কী প্রতিক্রিয়াশীল? মুলতুবি থাকলে অন্য কোনও ইভেন্টে আগুন লাগবে? (
বিটিডাব্লু

1
এমডিএন এর মতে, যদি ফাংশনটি অন্তর সময়ের চেয়ে বেশি সময় ধরে সম্পাদন করতে পারে তবে এটি " বিপজ্জনক ব্যবহার " হিসাবে বিবেচিত হয় । একটি পুনরাবৃত্তি setTimoutকল পছন্দ করা হয়।
মিঃ হোয়েট

6

এটিকে কিছুটা ভিন্নভাবে দেখার জন্য: সেটইন্টারওয়াল বিস্মৃত হয় যে কোড প্রতিটি প্রদত্ত বিরতিতে (যেমন 1000 মিমি, বা আপনি কতটা নির্দিষ্ট করেন) চালিত হয় যখন সেটটাইমআউট কোডটি চালিত না হওয়া পর্যন্ত এটি অপেক্ষা করে এমন সময় নির্ধারণ করে। এবং যেহেতু কোডটি চালাতে অতিরিক্ত মিলি সেকেন্ড লাগে, তাই এটি 1000 মিমি পর্যন্ত যোগ করে এবং তাই সেটটাইমআউটটি আবারও নির্ভুল সময়ে (1000ms এর বেশি) চলে।

উদাহরণস্বরূপ, টাইমারস / কাউন্টডাউনগুলি সেটটাইমআউট দিয়ে করা হয় না, এটি সেটিনটারওয়াল দিয়ে সম্পন্ন হয়, যাতে এটি যাতে দেরি না হয় এবং কোডটি সঠিক প্রদত্ত বিরতিতে চলে ensure


5

সেটআইন্টারওয়াল এবং সেটটাইমআউট উভয়ই টাইমার আইডি ফিরিয়ে দেয় যা আপনি কার্যকর করতে পারেন বাতিল করার জন্য, টাইমআউটগুলি ট্রিগার করার আগে। বাতিল করতে আপনি এই জাতীয় ক্লিয়ারইন্টার বা ক্লিয়ারটাইমআউটকে কল করুন:

var timeoutId = setTimeout(someFunction, 1000);
clearTimeout(timeoutId);
var intervalId = setInterval(someFunction, 1000),
clearInterval(intervalId);

এছাড়াও, পৃষ্ঠাটি ছেড়ে যাওয়া বা ব্রাউজার উইন্ডোটি বন্ধ করার সময় সময়সীমাগুলি স্বয়ংক্রিয়ভাবে বাতিল হয়ে যায়।


4

আপনি নীচের জাভাস্ক্রিপ্ট চালানোর সময় আপনি নিজেই বোবিন্স উত্তরটি যাচাই করতে পারেন বা এই জেএসফিডেলটি পরীক্ষা করতে পারেন

<div id="timeout"></div>
<div id="interval"></div>

var timeout = 0;
var interval = 0;

function doTimeout(){
    $('#timeout').html(timeout);
    timeout++;
    setTimeout(doTimeout, 1);
}

function doInterval(){
    $('#interval').html(interval);
    interval++;
}

$(function(){
    doTimeout();
    doInterval();
    setInterval(doInterval, 1);
});

3

ঠিক আছে, সেটটাইমআউট একটি পরিস্থিতিতে ভাল, যেমন আমি সবে শিখেছি। আমি সর্বদা সেটইন্টারভাল ব্যবহার করি, যা আমি আধা ঘণ্টারও বেশি সময় ব্যাকগ্রাউন্ডে চালাতে রেখেছি। আমি যখন সেই ট্যাবে ফিরে এসেছি, স্লাইডশোটি (যার উপর কোডটি ব্যবহৃত হয়েছিল) খুব দ্রুত পরিবর্তন হচ্ছিল, প্রতি 5 সেকেন্ডের পরিবর্তে এটি হওয়া উচিত। প্রকৃতপক্ষে এটি আরও ঘটেছিল কারণ আমি এটি আরও পরীক্ষা করি এবং এটি ব্রাউজারের দোষ কিনা বা গুরুত্বপূর্ণ নয়, কারণ সেটটাইমআউট দিয়ে পরিস্থিতি সম্পূর্ণ অসম্ভব।


মনে হচ্ছে আপনি যে ফাংশনটি কল করছেন সেটির ভিতরে আপনি সেটআইন্টারভাল বলেছেন। এভাবে আপনি সেটটাইমআউট দিয়ে লুপ করবেন তবে সেটইন্টারভাল দিয়ে আপনি প্রতিবার যখন একেবারে বলা হবে তখন সম্পূর্ণ নতুন লুপ তৈরি করছেন।
স্টিফেন আর


2

ইতিমধ্যে যা বলা হয়েছে তাতে কেবল যুক্ত করা কিন্তু কোডটির সেটটাইমআউট সংস্করণও পৌঁছে যাবে Maximum call stack sizeযা এটি কাজ করা থেকে বিরত রাখবে। যেহেতু পুনরাবৃত্তির ক্রিয়াকলাপ বন্ধ হওয়ার কোনও বেস কেস নেই তাই আপনি এটি চিরকাল চালাতে পারবেন না


আমি এটা সত্য মনে করি না। এখানে স্ট্যাকওভারফ্লো.com
কেভিন হুইলার

-1

সেট এবং আন্তঃরভাল (অভিব্যক্তি, সময়কাল) এর মধ্যে সর্বাধিক জেনারিক পার্থক্য that

সেটটাইমআউট () কেবলমাত্র ওপেন এবং তার নির্দিষ্ট সময়কালের পরে এক্সপ্রেশন কার্যকর করে।

যাহোক,

setInterval () প্রতিটি নির্দিষ্ট সময়কালের পরে INFINITE-LOOP এ অভিব্যক্তিটি কার্যকর করবে।


-5

আমি মনে করি SetIntervalএবং SetTimeoutভিন্ন। SetIntervalসময় নির্ধারিত সময় অনুযায়ী SetTimeoutব্লকটি কার্যকর করে, একবার কোডের ব্লক কার্যকর করে।

টাইমআউট কাউন্টডাউন সেকেন্ডের পরে এই সেটগুলির কোডগুলি চেষ্টা করুন:

setInterval(function(e){
    alert('Ugbana Kelvin');
}, 2000);

এবং তারপর চেষ্টা করুন

setTimeout(function(e){
    alert('Ugbana Kelvin');
}, 2000);

আপনি নিজের জন্য পার্থক্য দেখতে পারেন।


এটি প্রশ্নের উত্তর দেয় না। সেটটাইমওয়ালা () সেটিনটারভাল হিসাবে একই ফলাফল দিতে পুনরাবৃত্তভাবে ব্যবহার করা যেতে পারে। প্রশ্ন ছিল এই দুটি বিকল্পের কর্মক্ষমতা সম্পর্কে।
টমাস গঞ্জালেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.