जवाबों:
निम्नलिखित है:
setTimeout(function, milliseconds);
फ़ंक्शन जिसे समय बीत सकता है जिसके बाद फ़ंक्शन निष्पादित किया जाएगा।
देखें: खिड़की setTimeout()
विधि ।
function_reference
जब तक आप शामिल नहीं करेंगे, यह तुरंत निष्पादित नहीं होगा ()
। Ie function_reference
सिर्फ इतना है कि - एक संदर्भ; पासिंग function_reference()
समारोह को तुरंत लागू करेगा।
बाकी सभी के बारे में जो कुछ भी कहा गया है उसे जोड़ने के लिए setTimeout
: यदि आप भविष्य में किसी पैरामीटर के साथ किसी फ़ंक्शन को कॉल करना चाहते हैं, तो आपको कुछ अनाम फ़ंक्शन कॉल सेट करने की आवश्यकता है।
आपको फ़ंक्शन को बाद में बुलाया जाने के लिए एक तर्क के रूप में पारित करने की आवश्यकता है। वास्तव में यह नाम के पीछे कोष्ठक के बिना इसका मतलब है। निम्नलिखित अलर्ट को एक बार में कॉल करेगा, और यह 'हैलो वर्ल्ड' प्रदर्शित करेगा:
var a = "world";
setTimeout(alert("Hello " + a), 2000);
इसे ठीक करने के लिए आप या तो एक फ़ंक्शन का नाम रख सकते हैं (जैसा कि Flubba ने किया है) या आप एक अनाम फ़ंक्शन का उपयोग कर सकते हैं। यदि आपको एक पैरामीटर पास करने की आवश्यकता है, तो आपको एक अनाम फ़ंक्शन का उपयोग करना होगा।
var a = "world";
setTimeout(function(){alert("Hello " + a)}, 2000);
a = "Stack Overflow";
लेकिन अगर आप उस कोड को चलाते हैं तो आप देखेंगे कि 2 सेकंड के बाद पॉपअप 'हैलो स्टैक ओवरफ्लो' कहेगा। ऐसा इसलिए है क्योंकि चर का मान उन दो सेकंड में बदल गया है। दो मिनट के बाद इसे 'हैलो वर्ल्ड' कहने के लिए, आपको निम्नलिखित कोड स्निपेट का उपयोग करना होगा:
function callback(a){
return function(){
alert("Hello " + a);
}
}
var a = "world";
setTimeout(callback(a), 2000);
a = "Stack Overflow";
यह 2 सेकंड प्रतीक्षा करेगा और फिर 'हैलो वर्ल्ड' पॉपअप करेगा।
यदि आप वास्तव में एक अवरुद्ध (समकालिक) delay
कार्य करना चाहते हैं (जो भी हो), तो ऐसा कुछ क्यों न करें:
<script type="text/javascript">
function delay(ms) {
var cur_d = new Date();
var cur_ticks = cur_d.getTime();
var ms_passed = 0;
while(ms_passed < ms) {
var d = new Date(); // Possible memory leak?
var ticks = d.getTime();
ms_passed = ticks - cur_ticks;
// d = null; // Prevent memory leak?
}
}
alert("2 sec delay")
delay(2000);
alert("done ... 500 ms delay")
delay(500);
alert("done");
</script>
delay
आईएनजी को आईएनजी से पहले ताज़ा कर सकता हूं ( इस प्रश्न का उत्तर देने के लिए )। क्या ऐसा करने का कोई तरीका है?
आपको सेटटाइमआउट का उपयोग करने और इसे कॉलबैक फ़ंक्शन पास करने की आवश्यकता है । आप जावास्क्रिप्ट में नींद का उपयोग नहीं कर सकते इसका कारण यह है कि आप इस बीच कुछ भी करने से पूरे पृष्ठ को अवरुद्ध कर देंगे। अच्छी योजना नहीं। जावास्क्रिप्ट इवेंट मॉडल का उपयोग करें और खुश रहें। यह लड़ाई मत करो!
आप नियमित अंतराल पर कुछ कोड को बार-बार चलाने के लिए window.setInterval () का भी उपयोग कर सकते हैं ।
setTimeout()
एक बार करता है, एक बार setInterval()
करता है। यदि आप चाहते हैं कि आपका कोड हर 5 सेकंड में चले, तो setInterval()
यह काम के लिए बनाया गया है।
पहले की टिप्पणियों को जोड़ने के लिए, मैं निम्नलिखित कहना चाहूंगा:
setTimeout()
जावास्क्रिप्ट में समारोह असल स्क्रिप्ट के कार्य निष्पादन रुकता नहीं है, लेकिन केवल संकलक भविष्य में कोड कुछ समय निष्पादित करने के लिए कहता है।
ऐसा कोई फ़ंक्शन नहीं है जो वास्तव में जावास्क्रिप्ट में निर्मित निष्पादन को रोक सकता है। हालांकि, आप अपने स्वयं के फ़ंक्शन को लिख सकते हैं जो Date()
फ़ंक्शन का उपयोग करके और आपकी आवश्यकता के समय अंतराल को जोड़ने तक बिना शर्त लूप की तरह कुछ करता है ।
यदि आपको केवल देरी का परीक्षण करने की आवश्यकता है, तो आप इसका उपयोग कर सकते हैं:
function delay(ms) {
ms += new Date().getTime();
while (new Date() < ms){}
}
और फिर यदि आप 2 सेकंड के लिए देरी करना चाहते हैं
delay(2000);
हालांकि उत्पादन के लिए सबसे अच्छा नहीं हो सकता है। टिप्पणियों में उस पर और अधिक
आप एक वादे के पीछे कोड क्यों नहीं डाल सकते हैं? (मेरे सिर के ऊपर से टाइप किया हुआ)
new Promise(function(resolve, reject) {
setTimeout(resolve, 2000);
}).then(function() {
console.log('do whatever you wanted to hold off on');
});
मुझे वास्तव में कॉल करने के लिए तीन अलग-अलग तरीकों के साथ मौरियस का स्पष्टीकरण (सबसे अधिक उत्कीर्ण प्रतिक्रिया) पसंद आया setTimeout
।
अपने कोड में मैं AJAX बचाने की घटना के पूरा होने पर स्वचालित रूप से पिछले पृष्ठ पर ऑटो-नेविगेट करना चाहता हूं। सेव इवेंट के पूरा होने के सीएसएस में एक मामूली एनीमेशन है जो यह दर्शाता है कि सेव सफल था।
मेरे कोड में मुझे पहले दो उदाहरणों के बीच एक अंतर मिला:
setTimeout(window.history.back(), 3000);
यह एक टाइमआउट के लिए इंतजार नहीं करता है - पीछे () को लगभग तुरंत बुलाया जाता है, भले ही मैं देरी के लिए कितनी भी संख्या डालूं।
हालाँकि, इसे बदलकर:
setTimeout(function() {window.history.back()}, 3000);
यह वही है जो मैं उम्मीद कर रहा था।
यह बैक () ऑपरेशन के लिए विशिष्ट नहीं है, ऐसा ही होता है alert()
। मूल रूप alert()
से पहले मामले में उपयोग के साथ , देरी समय की अनदेखी की जाती है। जब मैं पॉपअप को खारिज करता हूं तो CSS के लिए एनीमेशन जारी रहता है।
इस प्रकार, मैं दूसरी या तीसरी विधि का वर्णन करूंगा, भले ही आप कार्यों में निर्मित और तर्कों का उपयोग न कर रहे हों।
मेरे पास कुछ अजाक्स कमांड थे जिन्हें मैं बीच में देरी के साथ चलाना चाहता था। ऐसा करने का एक सरल उदाहरण यहां दिया गया है। मैं अपने अपरंपरागत दृष्टिकोण के लिए श्रेडों को चीरने के लिए तैयार हूं। :)
// Show current seconds and milliseconds
// (I know there are other ways, I was aiming for minimal code
// and fixed width.)
function secs()
{
var s = Date.now() + ""; s = s.substr(s.length - 5);
return s.substr(0, 2) + "." + s.substr(2);
}
// Log we're loading
console.log("Loading: " + secs());
// Create a list of commands to execute
var cmds =
[
function() { console.log("A: " + secs()); },
function() { console.log("B: " + secs()); },
function() { console.log("C: " + secs()); },
function() { console.log("D: " + secs()); },
function() { console.log("E: " + secs()); },
function() { console.log("done: " + secs()); }
];
// Run each command with a second delay in between
var ms = 1000;
cmds.forEach(function(cmd, i)
{
setTimeout(cmd, ms * i);
});
// Log we've loaded (probably logged before first command)
console.log("Loaded: " + secs());
आप कोड ब्लॉक को कॉपी करके कंसोल विंडो में पेस्ट कर सकते हैं और कुछ इस तरह देख सकते हैं:
Loading: 03.077
Loaded: 03.078
A: 03.079
B: 04.075
C: 05.075
D: 06.075
E: 07.076
done: 08.076
देरी समारोह:
/**
* delay or pause for some time
* @param {number} t - time (ms)
* @return {Promise<*>}
*/
const delay = async t => new Promise(resolve => setTimeout(resolve, t));
async
समारोह के अंदर उपयोग :
await delay(1000);
जैसा कि अन्य ने कहा, सेटटाइमआउट आपकी सबसे सुरक्षित शर्त है
लेकिन कभी-कभी आप किसी नए फ़ंक्शन के तर्क को अलग नहीं कर सकते हैं तो आप मिलीसेकंड प्राप्त करने के लिए Date.now () का उपयोग कर सकते हैं और स्वयं विलंब कर सकते हैं ...।
function delay(milisecondDelay) {
milisecondDelay += Date.now();
while(Date.now() < milisecondDelay){}
}
alert('Ill be back in 5 sec after you click OK....');
delay(5000);
alert('# Im back # date:' +new Date());