जवाबों:
केवल पहली बार सीधे फंक्शन को कॉल करना सबसे सरल है:
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
सख्त मोड में उपलब्ध नहीं है
मैं एक ही समस्या के कारण इस सवाल पर लड़खड़ा गया, लेकिन जवाब में से कोई भी मदद नहीं करता है अगर आपको बिल्कुल वैसा ही व्यवहार करने की आवश्यकता है , setInterval()
लेकिन एकमात्र अंतर है कि फ़ंक्शन को शुरुआत में तुरंत बुलाया जाता है।
यहाँ इस समस्या का समाधान है:
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 के तीसरे तर्क को सही पर सेट करें और यह setInterval को कॉल करने के तुरंत बाद पहली बार चलेगा:
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
फू को भी पास कर सकते हैं , यदि आप clearInterval(_timer)
एक निश्चित शर्त पर करना चाहते हैं
var _timer = setInterval(function() { foo(_timer, params) }, delay);
foo(_timer, params);
यहाँ सभी गड़बड़ के बिना नौसिखियों के लिए एक सरल संस्करण है। यह सिर्फ फ़ंक्शन की घोषणा करता है, इसे कॉल करता है, फिर अंतराल शुरू करता है। बस।
//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 );
एक सुविधाजनक npm पैकेज है जिसे FirstInterval कहा जाता है (पूर्ण प्रकटीकरण, यह मेरा है) ।
यहां कई उदाहरणों में पैरामीटर हैंडलिंग शामिल नहीं है, और 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)
यह myfunction को बुलाएगा, और फिर इसे हर 45 सेकंड में अगियायन करेगा जो करने से अलग है
interval = setInterval(myfunction, 45000)
जो इसे कॉल नहीं करेगा, लेकिन इसे केवल शेड्यूल करें
myFunction()
वह खुद लौट आए। प्रत्येक फ़ंक्शन को संशोधित करने के बजाय setInterval
इसे कॉल करने के लिए एक बेहतर तरीका है कि setInterval
एक बार लपेटें जैसे कि अन्य उत्तर प्रस्तावित कर रहे हैं।
function
एक बार कॉल करने की कोशिश कर सकते हैं और फिर कर सकते हैंsetInterval()