2011-09-14 17 views
19

मैं हर 20 सेकंड में फ़ंक्शन कॉल करने के लिए setInterval() फ़ंक्शन का उपयोग कर रहा हूं। हालांकि, मैंने देखा कि एक बात यह है कि पहली बार setInterval() वास्तव में कॉल करता है कि फ़ंक्शन 20 सेकंड पर है (और जब setInterval() कहा जाता है)। यहां मेरा वर्तमान कार्यप्रणाली है:जावास्क्रिप्ट: अभी शुरू करने के लिए setInterval() कैसे प्राप्त करें?

dothis(); 
var i = setInterval(dothis, 20000); 

क्या यह डुप्लिकेट कोड प्राप्त किए बिना इसे प्राप्त करने का कोई तरीका है?

उत्तर

29

आपकी विधि इसे करने का सामान्य तरीका है।

इस अधिक से अधिक ऊपर आता है, तो आप एक उपयोगिता समारोह है कि हैंडलर पहले निष्पादित और फिर अंतराल सेट कर सकता है:

function setIntervalAndExecute(fn, t) { 
    fn(); 
    return(setInterval(fn, t)); 
} 

फिर, अपने कोड में, तुम बस ऐसा कर सकता है:

var i = setIntervalAndExecute(dothis, 20000); 
+0

जानना अच्छा है। धन्यवाद! – Andrew

2

यदि आपके dothis फ़ंक्शन के पास वापसी मूल्य की कोई अन्य आवश्यकता नहीं है, तो आप इसे स्वयं वापस कर सकते हैं।

यह आपको एक ही समय में आमंत्रित करने और पास करने की अनुमति देगा। यदि वापसी मूल्य अन्यथा अनदेखा किया जाता है, तो यह हानिरहित होगा।

function dothis() { 
    // your code 
    return dothis; 
} 

var i = setInterval(dothis(), 20000); 

अन्यथा, आप का विस्तार कर सकता है Function.prototype एक आह्वान देने के लिए और अपने सभी कार्यों पर लौटने कार्यक्षमता के लिए: एक साhttp://jsfiddle.net/ZXeUz/

Function.prototype.invoke_assign = function() { 
    var func = this, 
     args = arguments; 
    func.call.apply(func, arguments); 
    return function() { func.call.apply(func, args); }; 
}; 

setInterval(dothis.invoke_assign('thisArg', 1, 2, 3), 20000); 

// thisArg 1 2 3 
// thisArg 1 2 3 
// thisArg 1 2 3 
// ... 

यह वास्तव में बढ़ाता बातें:

डेमो । यह आपको तर्कों का एक सेट पास करने देता है। पहला तर्क आपके द्वारा आमंत्रित किए जा रहे फ़ंक्शन के this मान को सेट करेगा, और शेष तर्क नियमित तर्क के रूप में पारित किए जाएंगे।

क्योंकि फ़ंक्शन लौटाया गया है किसी अन्य फ़ंक्शन में लपेटा गया है, तो आपके प्रारंभिक और अंतराल के आमंत्रणों के बीच समान व्यवहार होगा।

10

आप एक अज्ञात फ़ंक्शन बना सकते हैं और इसे तुरंत कॉल कर सकते हैं, सिवाय इसके कि आप setInterval के बजाय setTimeout फ़ंक्शन का उपयोग करें।

(function doStuff() { 
    //Do Stuff Here 
    setTimeout(doStuff,20000); 
})(); 

यह फ़ंक्शन निष्पादित करेगा, फिर इसे 20 सेकंड में फिर से कॉल करें।

ध्यान दें कि आपके इच्छित व्यवहार या प्रदर्शन के लिए कुछ मामलों में, सेटटाइटर पर सेटटाइमआउट का उपयोग करना बेहतर हो सकता है। मुख्य अंतर यह है कि setInterval कॉल करता है जो उस टाइमआउट के दौरान कार्य करता है, अगर अंतिम कॉल निष्पादित हो गया है या कोई त्रुटि उत्पन्न होती है तो REGARDLESS। सेटटाइमआउट का उपयोग करना यह फैशन सुनिश्चित करता है कि फ़ंक्शन टाइमर रीसेट से पहले इसके निष्पादन को समाप्त कर देता है। बहुत सारे ट्रेडऑफ बहुत स्पष्ट हैं, लेकिन जब आप अपना आवेदन डिज़ाइन करते हैं तो ध्यान में रखना एक अच्छी बात है।

EDIT पैट्रिक के समय में टाइमआउट रद्द करने की आवश्यकता होने के बारे में चिंता के जवाब में।सबसे अच्छा समाधान गुमनाम समारोह का उपयोग नहीं करने के लिए, और सिर्फ घोषणा के बाद इसे कहते है

var timeout; 
function doStuff() { 
    //doStuff 
    timeout = setTimeout(doStuff,20000); 
} 
doStuff() 

हाँ यह है कि क्या ओ पी से बचने के लिए कोशिश कर रहा था के समान है, लेकिन यह फ़ंक्शन को कॉल करें और उसके बाद कॉल करने के लिए की जरूरत है निकालता है setInterval फ़ंक्शन, ताकि आप कोड की एक पंक्ति सहेज सकें। आप किसी भी समय फ़ंक्शन को रोक और शुरू कर सकते हैं:

//Stop it 
clearTimeout(timeout); 

//Start it 
doStuff(); 
+0

प्लस: 'सेटटाइमआउट' बेहतर है क्योंकि कोई त्रुटि होने पर दोहराना जारी नहीं रहेगा। – Hemlock

+0

+1 मुझे लगता है कि अगर यह फ़ंक्शन को बाहरी रूप से आमंत्रित करने की कोई अन्य आवश्यकता नहीं है तो यह एक अच्छा समाधान है। – user113716

+0

... हालांकि आप अपने वर्तमान उत्तर के साथ एक बिट कार्यक्षमता खो रहे हैं। ओपी के पास एक चर के लिए निर्दिष्ट 'setInterval' का रिटर्न परिणाम था, जो यह इंगित कर सकता है कि कुछ बिंदु पर अंतराल रद्द किया जाना चाहिए। व्यवहार को दोहराने के लिए, आपको ध्वज की स्थिति पर 'सेटटाइमआउट' आकस्मिक के माध्यम से रिकर्सिव कॉल करना होगा जिसे आमंत्रण को रोकने के लिए सेट किया जा सकता है। – user113716

संबंधित मुद्दे