উত্তর:
কেবলমাত্র প্রথমবার নিজেকে সরাসরি ফাংশনটি কল করা সবচেয়ে সহজ:
foo();
setInterval(foo, delay);
তবে এড়ানোর উপযুক্ত কারণগুলি রয়েছে setInterval
- বিশেষত কিছু পরিস্থিতিতে পুরো setInterval
ঘটনা পুরোপুরি কোনও দেরি না করে একে অপরের সাথে সাথে আসতে পারে। আর একটি কারণ হ'ল আপনি যদি লুপটি থামাতে চান তবে আপনাকে স্পষ্টভাবে কল করতে হবে clearInterval
যার অর্থ আপনাকে মূল setInterval
কল থেকে ফিরে আসা হ্যান্ডেলটি মনে রাখতে হবে।
সুতরাং বিকল্প বিকল্পটি এর পরিবর্তে foo
পরবর্তী কলগুলির জন্য নিজেকে ট্রিগার setTimeout
করা:
function foo() {
// do stuff
// ...
// and schedule a repeat
setTimeout(foo, delay);
}
// start the cycle
foo();
এটি গ্যারান্টি দেয় যে কলগুলির মধ্যে অন্তত অন্তর অন্তর রয়েছে delay
। প্রয়োজনে লুপটি বাতিল করাও সহজ করে তোলে - setTimeout
আপনার লুপ সমাপ্তির শর্তটি পৌঁছে গেলে আপনি কেবল কল করবেন না ।
আরও ভাল, আপনি এগুলি সমস্ত মুহুর্তে অনুরোধ করা ফাংশন এক্সপ্রেশনটিতে আবদ্ধ করতে পারেন যা ফাংশন তৈরি করে, যা পরে আবার নিজেকে উপরে হিসাবে কল করে এবং স্বয়ংক্রিয়ভাবে লুপটি শুরু করে:
(function foo() {
...
setTimeout(foo, delay);
})();
যা ফাংশনটি সংজ্ঞায়িত করে এবং একসাথে চক্রটি শুরু করে।
setTimeout
?
setInterval
ঘটনা পুরোদমে কোনও বিলম্ব ছাড়াই একে অপরের সাথে সাথে আসতে পারে।
setTimeout
পদ্ধতিটি ব্যবহার করি তবে কীভাবে আমি ফাংশনটি বন্ধ করব ?
আমি আপনাকে সঠিকভাবে বুঝতে পারছি কিনা তা নিশ্চিত নই তবে আপনি সহজেই এরকম কিছু করতে পারেন:
setInterval(function hello() {
console.log('world');
return hello;
}(), 5000);
এটি করার কোনও উপায় স্পষ্টতই রয়েছে তবে এটি আমি সবচেয়ে সংক্ষিপ্তভাবে ভাবতে পারি।
arguments.callee
ES5 কঠোর মোডে উপলব্ধ নয়
একই সমস্যার কারণে আমি এই প্রশ্নটিতে হোঁচট খেয়েছি তবে উত্তরগুলির কোনওটিই আপনাকে সাহায্য করতে পারে না ঠিক যেমন আচরণ করতে হবে setInterval()
তবে কেবলমাত্র পার্থক্যটির সাথে সাথে শুরুতে ফাংশনটি বলা হয়েছিল is
এই সমস্যার সমাধানটি এখানে দেওয়া হল:
function setIntervalImmediately(func, interval) {
func();
return setInterval(func, interval);
}
এই সমাধানের সুবিধা:
setInterval
সহজেই প্রতিস্থাপনের সাথে মানিয়ে নেওয়া যায়clearInterval()
পরে এটি পাস করতে পারেনউদাহরণ:
// create 1 second interval with immediate execution
var myInterval = setIntervalImmediately( _ => {
console.log('hello');
}, 1000);
// clear interval after 4.5 seconds
setTimeout( _ => {
clearInterval(myInterval);
}, 4500);
কৌতুকপূর্ণ হওয়ার জন্য, আপনার যদি সত্যিই ব্যবহারের প্রয়োজন হয় setInterval
তবে আপনি মূলটি প্রতিস্থাপন করতে পারেন setInterval
। সুতরাং, আপনার বিদ্যমান কোডের আগে এটি যুক্ত করার সময় কোডের কোনও পরিবর্তন করার প্রয়োজন নেই:
var setIntervalOrig = setInterval;
setInterval = function(func, interval) {
func();
return setIntervalOrig(func, interval);
}
তবুও, উপরে তালিকাভুক্ত সমস্ত সুবিধাগুলি এখানে প্রয়োগ হয় তবে কোনও বিকল্পের প্রয়োজন হয় না।
setTimeout
কারণ এটি কোনও setInterval
বস্তু ফেরত দেয় । পরে কোডে থাকা এবং বর্তমান সময়ে সংজ্ঞায়িত ফাংশনগুলি এড়াতে, আমি প্রথম ফাংশন কলটি এই জাতীয় ফাংশনটিতে গুটিয়ে রাখি setTimeout
: setTimeout(function(){ func();},0);
প্রথম ফাংশনটি তারপরে বর্তমান প্রসেসিং চক্রের পরে ডাকা হয়, যা তাত্ক্ষণিকভাবে হয় তবে এটি হয় আরও ত্রুটি প্রমাণিত।
আপনি এমন setInterval()
কোনও ক্রিয়াকলাপে গুটিয়ে রাখতে পারেন যা আচরণটি সরবরাহ করে:
function instantGratification( fn, delay ) {
fn();
setInterval( fn, delay );
}
... তারপরে এটি ব্যবহার করুন:
instantGratification( function() {
console.log( 'invoked' );
}, 3000);
এটির প্রয়োজন হলে এটি সুন্দর করার জন্য একটি র্যাপার এখানে রয়েছে:
(function() {
var originalSetInterval = window.setInterval;
window.setInterval = function(fn, delay, runImmediately) {
if(runImmediately) fn();
return originalSetInterval(fn, delay);
};
})();
সেটইন্টারভালটির তৃতীয় যুক্তিটি সত্যে সেট করুন এবং সেটইন্টারভাল কল করার পরে এটি প্রথমবারের জন্য চালানো হবে:
setInterval(function() { console.log("hello world"); }, 5000, true);
বা তৃতীয় যুক্তি বাদ দিন এবং এটি এর আসল আচরণটি ধরে রাখবে:
setInterval(function() { console.log("hello world"); }, 5000);
কিছু ব্রাউজার সেট- ইন্টেরওয়ালের জন্য অতিরিক্ত যুক্তি সমর্থন করে যা এই মোড়কটিকে বিবেচনায় নেই; আমি মনে করি এগুলি খুব কমই ব্যবহৃত হয়, তবে আপনার যদি তাদের প্রয়োজন হয় তবে তা মনে রাখবেন।
কারও পক্ষে বাইরের this
ভিতরে আনতে হবে যেন এটি একটি তীরের ফাংশন।
(function f() {
this.emit("...");
setTimeout(f.bind(this), 1000);
}).bind(this)();
যদি উপরের উত্পাদনকারী আবর্জনা আপনাকে বিরক্ত করে তোলে তবে আপনি পরিবর্তে এটি বন্ধ করতে পারেন।
(that => {
(function f() {
that.emit("...");
setTimeout(f, 1000);
})();
})(this);
অথবা আপনার কোডের উপর নির্ভর করে ডেকরেটার ব্যবহার করার বিষয়টি@autobind
বিবেচনা করুন।
আমি নিম্নলিখিত ক্রমানুসারে ফাংশনগুলি কল করার পরামর্শ দেব
var _timer = setInterval(foo, delay, params);
foo(params)
আপনি কোনও নির্দিষ্ট শর্তে _timer
চাইলে আপনি foo এও দিতে পারেনclearInterval(_timer)
var _timer = setInterval(function() { foo(_timer, params) }, delay);
foo(_timer, params);
চারপাশে সমস্ত গোলমাল না করেই novices এর জন্য একটি সাধারণ সংস্করণ। এটি কেবল ফাংশনটি ঘোষণা করে, কল করে, তারপরে বিরতি শুরু করে। এটাই.
//Declare your function here
function My_Function(){
console.log("foo");
}
//Call the function first
My_Function();
//Set the interval
var interval = window.setInterval( My_Function, 500 );
ফার্স্ট ইন্টারভাল নামে একটি সুবিধাজনক এনপিএম প্যাকেজ রয়েছে (সম্পূর্ণ প্রকাশ, এটি আমার)।
এখানকার অনেক উদাহরণের মধ্যে প্যারামিটার হ্যান্ডলিং অন্তর্ভুক্ত নয় এবং setInterval
কোনও বড় প্রকল্পে ডিফল্ট আচরণ পরিবর্তন করা খারাপ। দস্তাবেজগুলি থেকে:
এই প্যাটার্ন
setInterval(callback, 1000, p1, p2);
callback(p1, p2);
অনুরূপ
firstInterval(callback, 1000, p1, p2);
আপনি যদি ব্রাউজারে পুরানো স্কুল হন এবং নির্ভরতা না চান তবে কোড থেকে এটি সহজেই কাট-পেস্ট করা যায়।
// YCombinator
function anonymous(fnc) {
return function() {
fnc.apply(fnc, arguments);
return fnc;
}
}
// Invoking the first time:
setInterval(anonymous(function() {
console.log("bar");
})(), 4000);
// Not invoking the first time:
setInterval(anonymous(function() {
console.log("foo");
}), 4000);
// Or simple:
setInterval(function() {
console.log("baz");
}, 4000);
ঠিক আছে এটি এত জটিল, সুতরাং আমি এটি আরও সহজ করে বলি:
function hello(status ) {
console.log('world', ++status.count);
return status;
}
setInterval(hello, 5 * 1000, hello({ count: 0 }));
আপনি খুব ছোট প্রাথমিক বিলম্ব-সময় (উদাহরণস্বরূপ 100) সেট করতে পারেন এবং এটি ফাংশনটির মধ্যে আপনার পছন্দসই বিলম্ব-সময়কে সেট করতে পারেন:
var delay = 100;
function foo() {
console.log("Change initial delay-time to what you want.");
delay = 12000;
setTimeout(foo, delay);
}
আপনার ফাংশনটির তাত্ক্ষণিক অ্যাসিনক্রোনাস কল নিয়ে একটি সমস্যা আছে কারণ স্ট্যান্ডার্ড সেটটাইমআউট / সেটইন্টারভাল বেশ কয়েকটি মিলিসেকেন্ড সম্পর্কে নূন্যতম টাইমআউট রয়েছে এমনকি আপনি এটি সরাসরি 0 এ সেট করে থাকলেও এটি ব্রাউজারের নির্দিষ্ট কাজের কারণে ঘটে।
রিয়েল শূন্যের বিলম্ব সহ কোডের একটি উদাহরণ যা ক্রোম, সাফারি, অপেরাতে কাজ করে
function setZeroTimeout(callback) {
var channel = new MessageChannel();
channel.port1.onmessage = callback;
channel.port2.postMessage('');
}
আপনি এখানে আরও তথ্য পেতে পারেন
এবং প্রথম ম্যানুয়াল কলয়ের পরে আপনি আপনার ফাংশনটির সাথে একটি বিরতি তৈরি করতে পারেন।
আসলে দ্রুততম কাজ করা হয়
interval = setInterval(myFunction(),45000)
এটি মাইফাঙ্কশনটি কল করবে এবং তারপরে এটি প্রতি 45 সেকেন্ডে আগায়িয়ান করবে যা করা থেকে আলাদা
interval = setInterval(myfunction, 45000)
যা এটিকে কল করবে না, তবে কেবল সময় নির্ধারণ করবে
myFunction()
করে যদি return পরিবর্তে প্রতিটি ফাংশন setInterval
এটির দ্বারা পরিবর্তিত করা setInterval
অন্যান্য উত্তর প্রস্তাব দেওয়ার মতো একবার মোড়ানোর জন্য আরও ভাল পদ্ধতির ।
function
একবার কল করার চেষ্টা করতে পারেন এবং তারপরেsetInterval()