2011-04-27 15 views
15

एक प्रश्न। अगर मैं इस तरह से setInterval का उपयोग करें:जावास्क्रिप्ट सेट इंटरवल

setInterval('doSome();',60000); 

, मैं सुरक्षित कि doSome() समारोह हर 60 सेकंड शुरू हो रहा है कर रहा हूँ, भले ही मैं एक ब्राउज़र में टैब बदलते हैं?

+6

आप एक स्ट्रिंग के लिए 'setInterval' लेकिन एक समारोह पारित नहीं किया जाना चाहिए:' setInterval (doSome, 60000) 'या आप तर्क आदि की जरूरत है:' setInterval (function() {doSome (12345);}, 60000); निश्चित रूप से ' – ThiefMaster

+0

। मैं आपको इसके बजाय सेट इंटरवल (डूसम, 60000) के रूप में टाइप करने का सुझाव देता हूं, जो अधिक कुशल है। – gpilotino

+0

'सेट इंटरवल' को पारित स्ट्रिंग ठीक हैं। अंतर यह है कि उनका मूल्यांकन कैसे किया जाता है और किस दायरे से। –

उत्तर

1

यदि setInterval() फ़ंक्शन वाला टैब खुला रहता है, तो हाँ प्रत्येक 60 सेकंड में फ़ंक्शन निष्पादित किया जाएगा, भले ही आप अन्य टैब स्विच या खोलें।

0

हाँ, ब्राउज़र का ध्यान अप्रासंगिक है।

हालांकि, आपको setInterval पर स्ट्रिंग तर्क का उपयोग नहीं करना चाहिए। इसके बजाय फ़ंक्शन के संदर्भ का उपयोग करें:

setInterval(doSome, 60000); 
+0

'सेट इंटरवल' को पारित स्ट्रिंग ठीक हैं। अंतर यह है कि उनका मूल्यांकन कैसे किया जाता है और किस दायरे से। –

+0

@ डेलन और गति, और सिंटैक्स हाइलाइटिंग, और उद्धरण चिह्नों से बचने जैसी बेवकूफ चीजों को करने की आवश्यकता। 'SetInterval' पर तारों को पास करना * गलत * नहीं है, प्रति से, केवल दिमागहीन है। – lonesomeday

+0

यह सच है, और मैं आपके साथ सहमत हूं। –

0

नहीं, आपको सटीक समय की सुरक्षा की गारंटी नहीं है। जेएस घटना आधारित (और सिंगल-थ्रीडेड) है, इसलिए ईवेंट सही समय पर आग नहीं लगेगा, विशेष रूप से यदि आपके पास आपके पृष्ठ पर एक ही समय में अन्य कोड चल रहा है।

घटना सेट समय मूल्य के पड़ोस में आग लग जाएगी, लेकिन सटीक मिलीसेकंड पर नहीं। त्रुटि उस समय कोई अन्य घटना चल रही है, भले ही मिलीसेकंड के दस गुना हो। यह एक मुद्दा हो सकता है यदि उदाहरण के लिए आपके पास लंबी चल रही प्रक्रिया है जहां समय महत्वपूर्ण है। यदि आप करते हैं, तो आपको थोड़ी देर में घड़ी के साथ सिंक्रनाइज़ करना होगा।

0

हां इसे तब तक कॉल किया जाएगा जब तक पेज चालू नहीं होता है, भले ही टैब स्विच हो या ब्राउजर कम हो।

हालांकि सुनिश्चित करें कि आप setInterval को

समारोह नहीं एक स्ट्रिंग पारित कर यह होना चाहिए>

setInterval(doSome, 60000)

+0

'सेट इंटरवल' को पारित स्ट्रिंग ठीक हैं। अंतर यह है कि उनका मूल्यांकन कैसे किया जाता है और किस दायरे से। –

+0

धन्यवाद, मुझे यह नहीं पता था। – neebz

28

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

setInterval('doSome();', 60000); // this runs doSome from the global scope 
           // in the global scope 

और

setInterval(doSome, 60000);  // this runs doSome from the local scope 
           // in the global scope 

सही हैं, हालांकि वे एक थोड़ा अलग अर्थ है। यदिकुछ गैर-वैश्विक दायरे के लिए स्थानीय है, तो बाद वाले को उसी दायरे में कॉल करने से 60000ms अंतराल पर स्थानीय doSome चलाया जाएगा। पूर्व कोड को कॉल करना हमेशा वैश्विक दायरे में doSome की तलाश करेगा, और वैश्विक दायरे में doSome फ़ंक्शन नहीं होने पर विफल हो जाएगा।

समारोह मज़बूती से शुरू हो रहा होगा, टैब फोकस की परवाह किए बिना, कम से कम 60000ms के अंतराल पर, लेकिन आमतौर पर थोड़ा अधिक खर्च और देरी की वजह से।

सभी ब्राउज़र अंतराल मूल्य को कम से कम एक निश्चित मूल्य पर क्लैंप करते हैं ताकि अंतराल बहुत बार हो (मुझे लगता है कि यह न्यूनतम 10ms या 4ms या कुछ है, मुझे बिल्कुल याद नहीं है)।

ध्यान दें कि कुछ ब्राउज़र (आने वाले फ़ायरफ़ॉक्स 5 एक हैं, लेकिन शायद ऐसे अन्य लोग हैं जिन्हें मैं नहीं जानता) आगे क्लैंप setInterval उदाहरण के लिए यदि टैब केंद्रित नहीं है तो 1000ms। (Reference)

+0

एक और अंतर - पहले संस्करण में, आप वैश्विक चर 'doSome' के मान को बदल सकते हैं और अंतराल नए फ़ंक्शन को कॉल करना शुरू कर देगा। दूसरे संस्करण में आप ऐसा नहीं कर सकते हैं। –

2

नहीं, ईवेंट लूप को साफ़ होने तक अंतराल निष्पादित नहीं किया जा सकता है, इसलिए यदि आप उदाहरण के लिए setInterval(func, 1000); for(;;) करते हैं तो अंतराल कभी नहीं चलेगा। यदि अन्य ब्राउज़र टैब एक ही थ्रेड में चलते हैं (जैसे वे क्रोम में छोड़कर हर जगह (?) करते हैं, तो वही लागू होता है यदि वे टैब ईवेंट लूप को क्लोज करते हैं।)

लेकिन 60000 जितना बड़ा अंतराल है कम से कम संभावना है कि func उचित समय में बुलाया जाएगा। लेकिन कोई गारंटी नहीं है।

0

"सटीक समय सुरक्षा" के बारे में: निम्नलिखित कोड UpdateAllRefreshInterval मिलीसेकंड के अंतराल पर शुरू होता है, प्रत्येक सेकेंड समायोजन के साथ ताकि दूसरे की शुरुआत में प्रत्येक सेकंड में एक प्रारंभ होता है। कंप्यूटर की सीमित गति के लिए थोड़ी देर हो जाएगी, लेकिन त्रुटियां जमा नहीं होंगी।

function StartAtEachSecond() 
{ 
    var OneSecond = 1000; // milliseconds 
    var MinInteral = 50; // milliseconds, estimated safe interval 
    var StartTime = OneSecond - (new Date()).getMilliseconds(); // Time until next second starts. 
    if (StartTime < MinInteral) StartTime += OneSecond 
    window.setTimeout (StartAtEachSecond, StartTime + MinInteral); // To set up the second after the next. 
    for (var Delay = 0.0; Delay < OneSecond - MinInteral; Delay += RefreshInterval) 
    { 
     window.setTimeout (UpdateAll, StartTime + Delay); // Runs during the next second. 
    } 
} 
संबंधित मुद्दे