SetTimeOut और SetInterval, जावास्क्रिप्ट में किसका उपयोग करना बेहतर है? किसी फ़ंक्शन को निष्पादित करने के लिए जावास्क्रिप्ट टाइमर Jquery अंतराल कैसे काम करते हैं इसके बारे में

💖क्या आपको यह पसंद है?लिंक को अपने दोस्तों के साथ साझा करें

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

सरल सेटटाइमआउट उदाहरण

यह प्रदर्शित करने के लिए कि यह सुविधा कैसे काम करती है, मैं निम्नलिखित डेमो पर एक नज़र डालने का सुझाव देता हूं, जिसमें बटन क्लिक करने के दो सेकंड बाद एक पॉप-अप विंडो दिखाई देती है।

डेमो देखें

वाक्य - विन्यास

एमडीएन दस्तावेज़ सेटटाइमआउट के लिए निम्नलिखित सिंटैक्स प्रदान करता है:

var timeoutID = window.setTimeout(func, ); var timeoutID = window.setTimeout(code, );

  • टाइमआउटआईडी - एक संख्यात्मक आईडी जिसका उपयोग टाइमर को अक्षम करने के लिए क्लियरटाइमआउट() के साथ संयोजन में किया जा सकता है;
  • func - निष्पादित किया जाने वाला फ़ंक्शन;
  • कोड ( वैकल्पिक वाक्यविन्यास में) - निष्पादित किये जाने वाले कोड की पंक्ति;
  • देरी - मिलीसेकंड में देरी की अवधि, जिसके बाद फ़ंक्शन लॉन्च किया जाएगा। डिफॉल्यू मूल्य शून्य है।

सेटटाइमआउट बनाम विंडो.सेटटाइमआउट

उपरोक्त सिंटैक्स window.setTimeout का उपयोग करता है। क्यों?

वास्तव में, setTimeout और window.setTimeout व्यावहारिक रूप से एक ही फ़ंक्शन हैं। अंतर केवल इतना है कि दूसरी अभिव्यक्ति में हम वैश्विक विंडो ऑब्जेक्ट की संपत्ति के रूप में सेटटाइमआउट विधि का उपयोग करते हैं।

व्यक्तिगत रूप से, मुझे लगता है कि यह कोड को और अधिक जटिल बना देता है। यदि हमें कोई विकल्प परिभाषित करना हो जावास्क्रिप्ट विधिटाइमआउट, जिसे प्राथमिकता क्रम में पाया और लौटाया जा सकता है, हम और भी अधिक समस्याओं में भाग लेंगे।

में यह मैनुअलमैं विंडो ऑब्जेक्ट के साथ खिलवाड़ नहीं करना चाहता, लेकिन सामान्य तौर पर, यह आप पर निर्भर है कि किस सिंटैक्स का उपयोग करना है।

उपयोग के उदाहरण

यह फ़ंक्शन का नाम हो सकता है:

फ़ंक्शन विस्फोट ()) ( चेतावनी ("बूम!"); ) सेटटाइमआउट (विस्फोट, 2000);

वेरिएबल जो फ़ंक्शन को संदर्भित करता है:

var विस्फोट = फ़ंक्शन ()) ( चेतावनी ("बूम!"); ); सेटटाइमआउट (विस्फोट, 2000);

या एक अनाम फ़ंक्शन:

सेटटाइमआउट(फ़ंक्शन())(अलर्ट("बूम!"); ), 2000);

  • इस तरह के कोड को कम समझा जाता है और इसलिए, इसे आधुनिक बनाना या डीबग करना मुश्किल होगा;
  • इसमें eval() पद्धति का उपयोग शामिल है, जो एक संभावित भेद्यता हो सकती है;
  • यह विधि अन्य की तुलना में धीमी है क्योंकि इसमें चलने की आवश्यकता होती है जावास्क्रिप्ट दुभाषिया.

यह भी ध्यान दें कि हम कोड का परीक्षण करने के लिए जावास्क्रिप्ट टाइमआउट अलर्ट विधि का उपयोग कर रहे हैं।

सेटटाइमआउट में पैरामीटर पास करना

पहले में ( इसके अलावा, क्रॉस-ब्राउज़र) विकल्प, हम कॉलबैक फ़ंक्शन में पैरामीटर पास करते हैं, जिसे सेटटाइमआउट का उपयोग करके निष्पादित किया जाता है।

निम्नलिखित उदाहरण में, हम ग्रीटिंग सरणी से एक यादृच्छिक ग्रीटिंग निकालते हैं और इसे greet() फ़ंक्शन के पैरामीटर के रूप में पास करते हैं, जिसे 1 सेकंड की देरी से सेटटाइमआउट द्वारा निष्पादित किया जाता है:

फ़ंक्शन ग्रीट (ग्रीटिंग) ( कंसोल.लॉग (ग्रीटिंग); ) फ़ंक्शन getRandom (arr) ( रिटर्न एआरआर; ) var ग्रीटिंग्स = ["हैलो", "बोनजोर", "गुटेन टैग"], रैंडम ग्रीटिंग = गेट रैंडम (ग्रीटिंग्स); सेटटाइमआउट(फ़ंक्शन())( नमस्कार(रैंडमग्रीटिंग); ), 1000);

डेमो देखें

वैकल्पिक तरीका

लेख की शुरुआत में दिए गए सिंटैक्स में, एक और तरीका है जिसके द्वारा आप जावास्क्रिप्ट टाइमआउट द्वारा निष्पादित कॉलबैक फ़ंक्शन में पैरामीटर पास कर सकते हैं। यह विधिदेरी के बाद सभी मापदंडों के आउटपुट का तात्पर्य है।

पिछले उदाहरण के आधार पर, हमें मिलता है:

सेटटाइमआउट (अभिवादन, 1000, यादृच्छिक अभिवादन);

यह विधि IE 9 और उससे नीचे काम नहीं करेगी, जहां पारित मापदंडों को अपरिभाषित माना जाता है। लेकिन इस समस्या को हल करने के लिए एमडीएन में एक विशेष पॉलीफ़िल है.

संबंधित समस्याएँ और "यह"

सेटटाइमआउट द्वारा निष्पादित कोड उस फ़ंक्शन से अलग चलता है जिसने इसे कॉल किया था। इसकी वजह से हमें कुछ समस्याओं का सामना करना पड़ता है, जिनका समाधान निकाला जा सकता है कीवर्डयह।

var व्यक्ति = (पहला नाम: "जिम", परिचय: फ़ंक्शन())( कंसोल.लॉग ("हाय, मैं" हूँ " + यह.पहला नाम); ) ); व्यक्ति.परिचय(); // आउटपुट: नमस्ते, मैं "एम जिम सेटटाइमआउट(व्यक्ति.परिचय, 50); // आउटपुट: नमस्ते, मैं अपरिभाषित हूं

इस आउटपुट का कारण यह है कि पहले उदाहरण में यह व्यक्ति ऑब्जेक्ट को इंगित करता है, और दूसरे उदाहरण में यह वैश्विक विंडो ऑब्जेक्ट को इंगित करता है, जिसमें फर्स्टनेम प्रॉपर्टी नहीं है।

इस असंगतता से छुटकारा पाने के लिए, आप कई तरीकों का उपयोग कर सकते हैं:

इसे सेट करने के लिए बाध्य करें

यह बाइंड() का उपयोग करके किया जा सकता है, जो एक विधि है नयी विशेषता, जिसे कॉल करने पर इस कुंजी के मान के रूप में एक विशिष्ट मान का उपयोग किया जाता है। हमारे मामले में, निर्दिष्ट व्यक्ति आपत्ति करता है। यह अंततः हमें देता है:

सेटटाइमआउट(व्यक्ति.परिचय.बाइंड(व्यक्ति), 50);

नोट: बाइंड विधि ECMAScript 5 में पेश की गई थी, जिसका अर्थ है कि यह केवल आधुनिक ब्राउज़र में काम करेगी। दूसरों में, जब आप इसका उपयोग करेंगे तो आपको एक रनटाइम त्रुटि प्राप्त होगी जावास्क्रिप्ट "फ़ंक्शन टाइमआउट त्रुटि".

पुस्तकालय का प्रयोग करें

कई पुस्तकालयों में इस समस्या को हल करने के लिए आवश्यक अंतर्निहित फ़ंक्शन शामिल हैं। उदाहरण के लिए, jQuery.proxy() विधि। यह एक फ़ंक्शन लेता है और एक नया फ़ंक्शन लौटाता है जो हमेशा एक विशिष्ट संदर्भ का उपयोग करेगा। हमारे मामले में, संदर्भ यह होगा:

सेटटाइमआउट ($.प्रॉक्सी(व्यक्ति.परिचय, व्यक्ति), 50);

डेमो देखें

टाइमर अक्षम करना

सेटटाइमआउट का रिटर्न मान एक संख्यात्मक आईडी है जिसका उपयोग क्लियरटाइमआउट() फ़ंक्शन का उपयोग करके टाइमर को अक्षम करने के लिए किया जा सकता है:

var टाइमर = सेटटाइमआउट (myFunction, 3000); क्लियरटाइमआउट (टाइमर);

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

उदाहरण देखें

आइए इसे संक्षेप में बताएं

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

यह समझना बेहद महत्वपूर्ण है कि जावास्क्रिप्ट टाइमर कैसे काम करते हैं। अक्सर उनका व्यवहार मल्टीथ्रेडिंग की हमारी सहज समझ से मेल नहीं खाता है, और यह इस तथ्य के कारण है कि वास्तव में वे एक ही थ्रेड में निष्पादित होते हैं। आइए चार फ़ंक्शन देखें जिनके साथ हम टाइमर प्रबंधित कर सकते हैं:

  • var id = setTimeout(fn, देरी); - एक साधारण टाइमर बनाता है जो किसी दिए गए विलंब के बाद दिए गए फ़ंक्शन को कॉल करेगा। फ़ंक्शन एक अद्वितीय आईडी लौटाता है जिसके साथ टाइमर को रोका जा सकता है।
  • var id = setInterval(fn, देरी); - सेटटाइमआउट के समान, लेकिन एक निर्दिष्ट अंतराल पर फ़ंक्शन को लगातार कॉल करता है (बंद होने तक)।
  • क्लियरइंटरवल(आईडी);, क्लियरटाइमआउट(आईडी); - एक टाइमर आईडी स्वीकार करता है (ऊपर वर्णित कार्यों में से एक द्वारा लौटाया जाता है) और कॉलबैक का निष्पादन रोक देता है।
विचार करने का मुख्य विचार यह है कि टाइमर विलंब अवधि की सटीकता की गारंटी नहीं है। आरंभ करने के लिए, ब्राउज़र सभी अतुल्यकालिक जावास्क्रिप्ट घटनाओं को एक थ्रेड (जैसे माउस क्लिक या टाइमर) में निष्पादित करता है और केवल उस समय जब उस घटना की बारी होती है। इसे निम्नलिखित चित्र द्वारा सर्वोत्तम रूप से प्रदर्शित किया गया है:

इस आंकड़े में लेने के लिए बहुत सारी जानकारी है, लेकिन इसे समझने से आपको जावास्क्रिप्ट एसिंक्रोनी कैसे काम करती है इसकी गहरी समझ मिलेगी। यह चार्ट मिलीसेकंड में लंबवत रूप से समय का प्रतिनिधित्व करता है, नीले ब्लॉक निष्पादित किए गए जावास्क्रिप्ट कोड के ब्लॉक दिखाते हैं। उदाहरण के लिए, पहला ब्लॉक औसतन 18ms में निष्पादित होता है, एक माउस क्लिक लगभग 11ms के लिए निष्पादन को अवरुद्ध करता है, आदि।

जावास्क्रिप्ट केवल कोड के एक हिस्से को निष्पादित कर सकता है (निष्पादन की एकल-थ्रेडेड प्रकृति के कारण), जिनमें से प्रत्येक अन्य अतुल्यकालिक घटनाओं के निष्पादन को अवरुद्ध करता है। इसका मतलब यह है कि जब कोई अतुल्यकालिक घटना होती है (जैसे कि माउस क्लिक, टाइमर कॉल, या XMLHttp अनुरोध का पूरा होना), तो इसे एक कतार में जोड़ा जाता है और बाद में निष्पादित किया जाता है (निश्चित रूप से कार्यान्वयन ब्राउज़र के अनुसार भिन्न होता है, लेकिन चलो सहमत हैं इसे "कतार" कहें)।

आरंभ करने के लिए, आइए कल्पना करें कि दो टाइमर एक जावास्क्रिप्ट ब्लॉक के अंदर शुरू होते हैं: 10ms की देरी के साथ सेटटाइमआउट और उसी देरी के साथ सेटइंटरवल। टाइमर कब शुरू होगा इसके आधार पर, यह उस समय सक्रिय होगा जब हमने अभी तक कोड का पहला ब्लॉक पूरा नहीं किया है। हालाँकि, ध्यान दें कि यह तुरंत सक्रिय नहीं होता है (सिंगल थ्रेडिंग के कारण यह संभव नहीं है)। इसके बजाय, स्थगित फ़ंक्शन को कतारबद्ध किया जाता है और अगले उपलब्ध क्षण पर निष्पादित किया जाता है।

साथ ही, पहले जावास्क्रिप्ट ब्लॉक के निष्पादन के दौरान, एक माउस क्लिक होता है। इस अतुल्यकालिक घटना के लिए हैंडलर (और यह अतुल्यकालिक है क्योंकि हम इसकी भविष्यवाणी नहीं कर सकते हैं) को इस समय सीधे निष्पादित नहीं किया जा सकता है, इसलिए यह भी टाइमर की तरह एक कतार में समाप्त हो जाता है।

जावास्क्रिप्ट कोड का पहला ब्लॉक निष्पादित होने के बाद, ब्राउज़र प्रश्न पूछता है, "क्या निष्पादित होने की प्रतीक्षा है?" इस स्थिति में, माउस क्लिक हैंडलर और टाइमर प्रतीक्षा स्थिति में हैं। ब्राउज़र उनमें से एक (क्लिक हैंडलर) का चयन करता है और उसे निष्पादित करता है। टाइमर निष्पादन कतार में अगले उपलब्ध समय की प्रतीक्षा करेगा।

ध्यान दें कि जब माउस क्लिक हैंडलर निष्पादित हो रहा होता है, तो पहला अंतराल-कॉलबैक सक्रिय हो जाता है। टाइमर-कॉलबैक की तरह, इसे कतारबद्ध किया जाएगा। हालाँकि, ध्यान दें कि जब अंतराल फिर से सक्रिय होता है (जबकि टाइमर-कॉलबैक चल रहा है), तो इसे कतार से हटा दिया जाएगा। यदि कोड के एक बड़े टुकड़े को निष्पादित करते समय प्रत्येक अंतराल-कॉलबैक को कतारबद्ध किया जाता है, तो इसके परिणामस्वरूप कार्यों का एक समूह होगा जो कॉल करने की प्रतीक्षा कर रहे होंगे, उनके निष्पादन को पूरा करने के बीच कोई देरी अवधि नहीं होगी। इसके बजाय, ब्राउज़र तब तक इंतजार करते हैं जब तक कि कोई न हो कतार में एक और फ़ंक्शन जोड़ने से पहले कतार में और फ़ंक्शन बचे हैं।

इस प्रकार, हम उस मामले का निरीक्षण कर सकते हैं जब अंतराल-कॉलबैक की तीसरी फायरिंग उस क्षण के साथ मेल खाती है जब इसे पहले ही निष्पादित किया जा चुका है। यह एक महत्वपूर्ण बिंदु को दर्शाता है: अंतराल को परवाह नहीं है कि वर्तमान में क्या चल रहा है, उन्हें निष्पादन के बीच विलंब अवधि की परवाह किए बिना कतार में जोड़ा जाएगा।

अंत में, दूसरा अंतराल-कॉलबैक पूरा होने के बाद, हम देखेंगे कि जावास्क्रिप्ट इंजन को निष्पादित करने के लिए कुछ भी नहीं बचा है। इसका मतलब यह है कि ब्राउज़र फिर से नई एसिंक्रोनस घटनाओं के घटित होने की प्रतीक्षा करता है। यह 50 एमएस के निशान पर होगा, जहां अंतराल-कॉलबैक फिर से काम करेगा। इस बिंदु पर इसे रोकने के लिए कुछ भी नहीं होगा, इसलिए यह तुरंत काम करेगा।

आइए एक उदाहरण देखें जो सेटटाइमआउट और सेटइंटरवल के बीच अंतर को अच्छी तरह से दिखाता है।
setTimeout(function())( /* कोड का कुछ लंबा ब्लॉक... */ setTimeout(arguments.callee, 10); ), 10); setInterval(function())( /* कोड का कुछ लंबा ब्लॉक... */ ), 10);
ये दोनों विकल्प पहली नज़र में समतुल्य हैं, लेकिन वास्तव में ये नहीं हैं। पिछली कॉल के बाद सेटटाइमआउट का उपयोग करने वाले कोड में हमेशा कम से कम 10 एमएस की देरी होगी (यह अधिक हो सकती है, लेकिन कभी भी कम नहीं), जबकि सेटइंटरवल का उपयोग करने वाले कोड को हर 10 एमएस पर कॉल किया जाएगा, भले ही पिछली कॉल कब हुई हो।

आइए ऊपर कही गई हर बात को संक्षेप में प्रस्तुत करें:
- जावास्क्रिप्ट इंजन एकल-थ्रेडेड वातावरण का उपयोग करते हैं, अतुल्यकालिक घटनाओं को निष्पादन की प्रतीक्षा में कतार में परिवर्तित करते हैं,
- सेटटाइमआउट और सेटइंटरवल फ़ंक्शंस को एसिंक्रोनस कोड में मौलिक रूप से अलग तरीके से निष्पादित किया जाता है,
- यदि टाइमर को निष्पादित नहीं किया जा सकता है इस पल, इसमें अगले निष्पादन बिंदु तक विलंब होगा (जो वांछित विलंब से अधिक लंबा होगा),
- अंतराल (सेटइंटरवल) को बिना किसी देरी के एक के बाद एक निष्पादित किया जा सकता है यदि उनके निष्पादन में निर्दिष्ट देरी से अधिक समय लगता है।

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

स्रोत: http://learn.javascript.ru/settimeout-setinterval

लगभग सभी जावास्क्रिप्ट कार्यान्वयन में एक आंतरिक टाइमर शेड्यूलर होता है जो आपको एक निर्दिष्ट अवधि के बाद किसी फ़ंक्शन को कॉल करने के लिए शेड्यूल करने की अनुमति देता है।

विशेष रूप से, यह सुविधा ब्राउज़र और Node.JS सर्वर में समर्थित है।

सेटटाइमआउट

वाक्य - विन्यास:

var टाइमरआईडी = सेटटाइमआउट(func/कोड, देरी[, arg1, arg2...])

विकल्प:

  • func/कोड
    • निष्पादित किया जाने वाला कोई फ़ंक्शन या कोड की पंक्ति।
    • संगतता उद्देश्यों के लिए स्ट्रिंग का रखरखाव किया जाता है और इसकी अनुशंसा नहीं की जाती है।
  • देरी
    • विलंबता मिलीसेकंड में, 1000 मिलीसेकंड 1 सेकंड के बराबर है।
  • arg1, arg2…
    • फ़ंक्शन को पारित करने के लिए तर्क। IE9- में समर्थित नहीं है.
    • फ़ंक्शन विलंब पैरामीटर में निर्दिष्ट समय के बाद निष्पादित किया जाएगा।

उदाहरण के लिए, निम्नलिखित कोड एक सेकंड के बाद अलर्ट ("हैलो") ट्रिगर करेगा:

फ़ंक्शन func()( अलर्ट('हैलो' ); ) सेटटाइमआउट(func, 1000 );

यदि पहला तर्क एक स्ट्रिंग है, तो दुभाषिया उस स्ट्रिंग से एक अनाम फ़ंक्शन बनाता है।

यानी, यह प्रविष्टि बिल्कुल वैसे ही काम करती है:

सेटटाइमआउट ("अलर्ट ("हैलो")", 1000);

इसके बजाय अज्ञात फ़ंक्शंस का उपयोग करें:

सेटटाइमआउट( समारोह()(चेतावनी('हैलो' ) ), 1000 );

फ़ंक्शन और संदर्भ के लिए पैरामीटर

IE10 सहित सभी आधुनिक ब्राउज़रों में, सेटटाइमआउट आपको फ़ंक्शन पैरामीटर निर्दिष्ट करने की अनुमति देता है।

नीचे दिया गया उदाहरण IE9 को छोड़कर हर जगह "हैलो, मैं वास्या हूं" आउटपुट देगा-:

फ़ंक्शन नमस्ते कहें (कौन)(चेतावनी("हाय, मैं हूं" + कौन); ) सेटटाइमआउट(हाय कहो, 1000, "वास्या");

...हालांकि, ज्यादातर मामलों में हमें पुराने IE से समर्थन की आवश्यकता होती है, और यह आपको तर्क निर्दिष्ट करने की अनुमति नहीं देता है। इसलिए, उन्हें स्थानांतरित करने के लिए, वे कॉल को एक अज्ञात फ़ंक्शन में लपेटते हैं:

फ़ंक्शन नमस्ते कहें (कौन)(चेतावनी("हाय, मैं" + कौन); ) सेटटाइमआउट( समारोह()( कहोहाय("वास्या")), 1000);

सेटटाइमआउट को कॉल करने से यह संदर्भ पास नहीं होता है।

विशेष रूप से, सेटटाइमआउट के माध्यम से किसी ऑब्जेक्ट विधि को कॉल करना वैश्विक संदर्भ में काम करेगा। इससे गलत परिणाम आ सकते हैं.

उदाहरण के लिए, आइए एक सेकंड के बाद user.sayHi() पर कॉल करें:

फ़ंक्शन उपयोगकर्ता (आईडी) समारोह()(चेतावनी(यह .id); ); ) var उपयोगकर्ता = नया उपयोगकर्ता(12345); सेटटाइमआउट(user.sayHi, 1000); // अपेक्षित 12345, लेकिन आउटपुट "अपरिभाषित" होगा

चूंकि setTimeout वैश्विक संदर्भ में user.sayHi फ़ंक्शन चलाएगा, इसलिए उसे this के माध्यम से ऑब्जेक्ट तक पहुंच नहीं मिलेगी।

दूसरे शब्दों में, सेटटाइमआउट के लिए ये दो कॉल एक ही काम करते हैं:

// (1) एक लाइन सेटटाइमआउट(user.sayHi, 1000); // (2) दो पंक्तियों में एक ही बात var func = user.sayHi; सेटटाइमआउट(func, 1000 );

सौभाग्य से, एक मध्यवर्ती फ़ंक्शन बनाकर इस समस्या को भी आसानी से हल किया जा सकता है:

फ़ंक्शन उपयोगकर्ता (आईडी)(यह .id = id; यह .sayHi = समारोह()(चेतावनी(यह .id); ); ) var उपयोगकर्ता = नया उपयोगकर्ता(12345); सेटटाइमआउट( समारोह()( उपयोगकर्ता.sayHi(); ), 1000 );

एक रैपर फ़ंक्शन का उपयोग क्रॉस-ब्राउज़र तर्कों को पारित करने और निष्पादन संदर्भ को संरक्षित करने के लिए किया जाता है।

निष्पादन रद्द करना

सेटटाइमआउट फ़ंक्शन एक टाइमरआईडी लौटाता है जिसका उपयोग कार्रवाई को रद्द करने के लिए किया जा सकता है।

वाक्य - विन्यास:

क्लियरटाइमआउट(टाइमरआईडी)

निम्नलिखित उदाहरण में, हम एक टाइमआउट सेट करते हैं और फिर हटाते हैं (अपना विचार बदल दिया है)। परिणामस्वरूप, कुछ नहीं होता.

var टाइमरआईडी = सेटटाइमआउट( समारोह()(अलर्ट(1) ), 1000 ); क्लियरटाइमआउट(टाइमरआईडी);

सेटअंतराल

सेटइंटरवल विधि का सिंटैक्स सेटटाइमआउट के समान है।

var टाइमरआईडी = सेटइंटरवल(func/कोड, देरी[, arg1, arg2...])

तर्कों का अर्थ वही है. लेकिन, setTimeout के विपरीत, यह फ़ंक्शन को एक बार नहीं चलाता है, बल्कि इसे एक निर्दिष्ट समय अंतराल पर नियमित रूप से दोहराता है। आप कॉल करके निष्पादन रोक सकते हैं:

क्लियरइंटरवल(टाइमरआईडी)

निम्नलिखित उदाहरण, चलाने पर, हर दो सेकंड में एक संदेश प्रदर्शित करेगा जब तक आप स्टॉप बटन पर क्लिक नहीं करते:

<इनपुट प्रकार = "बटन" ऑनक्लिक = "क्लियरइंटरवल(टाइमर)" मान = "Stop" > !} <स्क्रिप्ट > वर मैं = 1 ; var टाइमर = सेटइंटरवल( समारोह()(अलर्ट(i++) ), 2000);स्क्रिप्ट >

सेटइंटरवल में कॉलों को कतारबद्ध करना और ओवरले करना

कॉल सेटइंटरवल(फ़ंक्शन, विलंब) फ़ंक्शन को निर्दिष्ट समय अंतराल पर निष्पादित करने का कारण बनता है। लेकिन यहां एक सूक्ष्मता है.

दरअसल, कॉल के बीच का ठहराव निर्दिष्ट अंतराल से कम है।

उदाहरण के लिए, आइए setInterval(function() ( func(i++) ), 100) लें। यह हर 100ms पर func निष्पादित करता है, हर बार काउंटर बढ़ाता है।

नीचे दी गई तस्वीर में, लाल ब्लॉक func का निष्पादन समय है। इंटरब्लॉक समय फ़ंक्शन रन के बीच का समय है और सेट विलंब से कम है!

अर्थात्, फ़ंक्शन के निष्पादन समय को ध्यान में रखे बिना, ब्राउज़र हर 100ms में फ़ंक्शन को बड़े करीने से लॉन्च करना शुरू कर देता है।

ऐसा होता है कि किसी फ़ंक्शन के निष्पादन में देरी से अधिक समय लगता है। उदाहरण के लिए, फ़ंक्शन जटिल है, लेकिन विलंब छोटा है। या फ़ंक्शन में अलर्ट/पुष्टि/प्रॉम्प्ट स्टेटमेंट शामिल हैं जो निष्पादन थ्रेड को अवरुद्ध करते हैं। यहीं से चीजें दिलचस्प होने लगती हैं।

यदि ब्राउज़र व्यस्त होने के कारण कोई फ़ंक्शन लॉन्च नहीं किया जा सकता है, तो ब्राउज़र के खाली होते ही इसे कतारबद्ध और निष्पादित किया जाएगा।

नीचे दी गई छवि दर्शाती है कि किसी फ़ंक्शन के लिए क्या होता है जिसे निष्पादित करने में लंबा समय लगता है।

सेटइंटरवल द्वारा शुरू किया गया फ़ंक्शन कॉल कतार में जोड़ा जाता है और जब संभव हो तो तुरंत होता है:

फ़ंक्शन का दूसरा लॉन्च पहले के अंत के तुरंत बाद होता है:

निष्पादन को एक से अधिक बार कतारबद्ध नहीं किया जाता है।

यदि किसी फ़ंक्शन को निष्पादित होने में कई निर्धारित निष्पादन से अधिक समय लगता है, तो यह अभी भी एक बार कतार में होगा। इसलिए लॉन्च का कोई "संचय" नहीं है।

नीचे दी गई छवि में, सेटइंटरवल फ़ंक्शन को 200ms में निष्पादित करने का प्रयास करता है और कॉल को कतारबद्ध करता है। 300 एमएस और 400 एमएस पर टाइमर फिर से जाग जाता है, लेकिन कुछ नहीं होता।

setInterval (फ़ंक्शन, विलंब) को कॉल करना निष्पादन के बीच वास्तविक देरी की गारंटी नहीं देता है।

ऐसे मामले होते हैं जब वास्तविक विलंब निर्दिष्ट विलंब से अधिक या कम होता है। सामान्य तौर पर, यह सच नहीं है कि कम से कम कुछ देरी होगी।

नेस्टेड सेटटाइमआउट को दोहराया जा रहा है

ऐसे मामलों में जहां आपको न केवल नियमित पुनरावृत्ति की आवश्यकता है, बल्कि शुरुआत के बीच एक अनिवार्य देरी की भी आवश्यकता है, उपयोग करें पुनर्स्थापनाहर बार फ़ंक्शन निष्पादित होने पर सेटटाइमआउट।

नीचे एक उदाहरण दिया गया है जो उनके बीच 2 सेकंड के अंतराल के साथ अलर्ट जारी करता है।

<इनपुट प्रकार = "बटन" ऑनक्लिक = "क्लियरटाइमआउट(टाइमर)" मान = "Stop" > !} <स्क्रिप्ट > वर मैं = 1 ; var टाइमर = सेटटाइमआउट( फ़ंक्शन रन()(अलर्ट(i++); टाइमर = सेटटाइमआउट(रन, 2000); ), 2000);स्क्रिप्ट >

निष्पादन समयरेखा में रनों के बीच निश्चित विलंब होगा। 100 एमएस विलंब के लिए चित्रण:

न्यूनतम टाइमर विलंब

ब्राउज़र टाइमर में न्यूनतम संभव विलंबता है। आधुनिक ब्राउज़रों में यह लगभग शून्य से 4ms तक भिन्न होता है। पुराने लोगों में यह लंबा हो सकता है और 15ms तक पहुंच सकता है।

मानक के अनुसार, न्यूनतम विलंब 4ms है. इसलिए setTimeout(..,1) और setTimeout(..,4) के बीच कोई अंतर नहीं है।

सेटटाइमआउट और सेटइंटरवल का शून्य-विलंबता व्यवहार ब्राउज़र-विशिष्ट है।

  1. ओपेरा में, setTimeout(.., 0) setTimeout(.., 4) के समान है। इसे setTimeout(..,2) की तुलना में कम बार निष्पादित किया जाता है। यह इस ब्राउज़र की एक विशेषता है.
  2. में इंटरनेट एक्सप्लोरर, शून्य विलंब सेटइंटरवल(.., 0) काम नहीं करेगा। यह विशेष रूप से setInterval पर लागू होता है, अर्थात। setTimeout(.., 0) ठीक काम करता है।

वास्तविक ट्रिगर आवृत्ति

प्रतिक्रिया बहुत कम बार हो सकती है। कुछ मामलों में, देरी 4ms नहीं, बल्कि 30ms या 1000ms भी हो सकती है।

अधिकांश ब्राउज़र (मुख्य रूप से डेस्कटॉप वाले) टैब निष्क्रिय होने पर भी सेटटाइमआउट / सेटइंटरवल निष्पादित करना जारी रखते हैं। साथ ही, उनमें से कई (क्रोम, एफएफ, आईई10) न्यूनतम टाइमर आवृत्ति को प्रति सेकंड 1 बार तक कम कर देते हैं। यह पता चला है कि टाइमर "पृष्ठभूमि" टैब में काम करेगा, लेकिन शायद ही कभी।

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

निष्कर्ष: 4ms की आवृत्ति पर ध्यान देने योग्य है, लेकिन आपको इस पर भरोसा नहीं करना चाहिए।

कंसोल पर आउटपुट अंतराल कॉल के बीच समय अंतराल की गणना करने वाला कोड कुछ इस तरह दिखता है:

वर टाइममार्क = नई तिथि; सेटटाइमआउट( फ़ंक्शन गो()(var diff = new Date - timeMark; // अगले विलंब को पृष्ठ के बजाय कंसोल पर आउटपुट करेंकंसोल .लॉग(अंतर); // अंत में समय याद रखें, // कॉल के बीच विलंब को मापने के लिएटाइममार्क = नई तारीख; सेटटाइमआउट (जाओ, 100); ), 100 );

ट्रिक है सेटटाइमआउट(func, 0)

यह ट्रिक जावास्क्रिप्ट हैक्स के इतिहास में प्रवेश करने योग्य है।

यदि आप इसे वर्तमान स्क्रिप्ट के अंत के बाद चलाना चाहते हैं तो फ़ंक्शन को setTimeout(func, 0) में लपेटा गया है।

बात यह है कि सेटटाइमआउट कभी भी फ़ंक्शन को तुरंत निष्पादित नहीं करता है। वह ही इसके कार्यान्वयन की योजना बनाता है। लेकिन जावास्क्रिप्ट दुभाषिया वर्तमान स्क्रिप्ट निष्पादित होने के बाद ही नियोजित कार्य करना शुरू कर देगा।

मानक के अनुसार, सेटटाइमआउट किसी फ़ंक्शन को 0 की देरी से निष्पादित नहीं कर सकता है, जैसा कि हमने पहले कहा था, देरी आमतौर पर 4ms होगी। लेकिन यहां मुख्य बात यह है कि किसी भी मामले में निष्पादन वर्तमान कोड के निष्पादन के बाद होगा।

उदाहरण के लिए:

वर परिणाम; फ़ंक्शन showResult()(अलर्ट(परिणाम); ) सेटटाइमआउट(शोरिजल्ट, 0); परिणाम = 2*2 ; // 4 प्रिंट करेगा

कुल

सेटइंटरवल(फंक, डिले) और सेटटाइमआउट(फंक, डिले) विधियां आपको नियमित रूप से/प्रत्येक विलंब मिलीसेकंड में एक बार फंक चलाने की अनुमति देती हैं।

दोनों विधियाँ टाइमर आईडी लौटाती हैं। इसका उपयोग क्लियरइंटरवल / क्लियरटाइमआउट को कॉल करके निष्पादन को रोकने के लिए किया जाता है।

| | सेटइंटरवल | सेटटाइमआउट | || ----------- | ---------- | | समय | कॉल सख्ती से टाइमर पर है। यदि दुभाषिया व्यस्त है, तो एक कॉल कतारबद्ध है। फ़ंक्शन निष्पादन समय को ध्यान में नहीं रखा जाता है, इसलिए एक रन के अंत से दूसरे की शुरुआत तक का समय अंतराल भिन्न हो सकता है। | सेटइंटरवल के बजाय सेटटाइमआउट के लिए एक पुनरावर्ती कॉल का उपयोग किया जाता है जहां निष्पादन के बीच एक निश्चित ठहराव की आवश्यकता होती है। | | देरी | न्यूनतम विलंब: 4ms. | न्यूनतम विलंब: 4ms. | | ब्राउज़र सुविधाएँ | IE में विलंबता 0 काम नहीं करती | ओपेरा में, शून्य विलंबता 4ms के बराबर है, गैर-मानक 1ms, 2ms और 3ms सहित अन्य देरी को सटीक रूप से नियंत्रित किया जाता है। |

प्रोग्रामिंग में स्क्रिप्टिंग भाषाएँसमय-समय पर एक विराम बनाने की आवश्यकता होती है - कार्यक्रम के निष्पादन को कुछ समय के लिए रोकें, और फिर काम करना जारी रखें। उदाहरण के लिए, VBS और PHP स्क्रिप्ट में निम्नलिखित विधियाँ संभव हैं:

वीबीएस: wscript.sleep 1500 (1.5 सेकंड के लिए रुकें)

PHP: नींद(10); (10 सेकंड रुकें)

ऐसे ठहराव के दौरान, रनटाइम सिस्टम (PHP या VBS) कुछ नहीं कर रहे. जावास्क्रिप्ट में किसी समान चीज़ का सहजता से उपयोग करने का प्रयास करने वाला डेवलपर अप्रिय रूप से आश्चर्यचकित हो जाएगा। सामान्य गलतीजावास्क्रिप्ट में विराम बनाने का प्रयास करते समय यह इस तरह दिखता है:

फ़ंक्शन बैडटेस्ट() (for (var i=1; i< 10; i++) { window.setTimeout("document.getElementById("test1").value += " + i, 900) } }

क्या आपको लगता है कि जब चक्र के दौरान अगला नंबर निकालने की बारी आती है, तो आपका सेटटाइमआउटईमानदारी से रोकेंगे जावास्क्रिप्ट कार्य, 0.9 सेकंड प्रतीक्षा करेगा, इनपुट फ़ील्ड के अंत में आवश्यक संख्या जोड़ें और फिर काम करना जारी रखें। लेकिन वास्तव में ऐसा नहीं है: सेटअंतरालऔर सेटटाइमआउटजावास्क्रिप्ट में, केवल कोष्ठक में निर्दिष्ट क्रिया (या फ़ंक्शन) को स्थगित किया जाता है। हमारे उदाहरण में, निम्नलिखित होगा:

  1. मैं = 1;
  2. इनपुट फ़ील्ड में संख्या "1" जोड़ने में 0.9 सेकंड की देरी;
  3. तुरंतइस समस्या को सेट करने के बाद, चक्र आगे बढ़ता है: i=2;
  4. इनपुट फ़ील्ड में संख्या "2" जोड़ने में 0.9 सेकंड की देरी;

तुरंतइसका मतलब है, उदाहरण के लिए, 1 एमएस (अर्थात, 900 एमएस की तुलना में बहुत छोटा): लूप अपना काम लगभग तुरंत करेगा, जिससे एक ही समय में कई स्थगित कार्य बनेंगे। इसका मतलब यह है कि सभी लंबित "ड्राइंग" कार्य लगभग एक ही समय में पूरे हो जाएंगे, नए नंबर जोड़ने के बीच बिना रुके। चक्र शुरू होता है; 0.9 सेकंड के लिए सब कुछ रुक जाता है; और शिर्र - सभी नंबरों को एक के बाद एक पंक्ति में शूट किया जाता है।

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

फ़ंक्शन वेलटेस्ट() (यदि (i< 9) { document.getElementById("test2").value += ++i window.setTimeout("welltest()", 400) } }

और दूसरा वैरिएबल मैंआपको फ़ंक्शन के बाहर आरंभ करना होगा - उदाहरण के लिए, इस तरह:

अब सब कुछ वैसे ही काम करता है जैसे उसे करना चाहिए (हमने विलंब समय को 0.9 सेकेंड से घटाकर 0.4 सेकेंड कर दिया है)। लेकिन ऐसे कार्यों के लिए इसका उपयोग न करना अधिक तर्कसंगत है सेटटाइमआउटसेटअंतराल(हालाँकि इसके लिए दो कार्यों की आवश्यकता होगी):

फ़ंक्शन बेस्टटेस्ट() ( window.i = 0 window.timer1 = window.setInterval("draw()", 400) ) फ़ंक्शन ड्रा() ( document.getElementById("test3").value += ++i if (i >=9) क्लियरइंटरवल(विंडो.टाइमर1) )

जावास्क्रिप्ट विधि की विशेषता सेटअंतरालतथ्य यह है कि यह "स्वयं" दूर नहीं जाता है, इसे एक विशेष विधि का उपयोग करके रोका जाना चाहिए स्पष्टअंतराल. और यह स्पष्ट करने के लिए कि वास्तव में क्या रोकना है, स्थगित कार्रवाई के लिए कार्य को एक विशेष पहचानकर्ता - एक टाइमर सौंपा गया है: window.timer1 = window.setInterval(...) ।

पहचानकर्ताओं को विधि द्वारा बनाए गए कार्यों को भी सौंपा जा सकता है सेटटाइमआउट. सभी टाइमर आईडी एक दूसरे से अलग होनी चाहिए (वर्तमान ब्राउज़र विंडो के भीतर अद्वितीय)। फिर आप विंडो में कई अलग-अलग कार्य बना सकते हैं जो स्थगित क्रियाओं का उपयोग करते हैं, और इन कार्यों को समानांतर में निष्पादित किया जाएगा (एक साथ, यदि कंप्यूटर में पर्याप्त संसाधन हैं), जो मूल रूप से PHP या VBS में असंभव है।

यहां एक पृष्ठ का उदाहरण दिया गया है जिसमें कई जावास्क्रिप्ट टाइमर एक साथ चल रहे हैं: setinterval.htm (सेटइंटरवल.जेएस फ़ाइल में जावास्क्रिप्ट फ़ंक्शन)। सभी पेज टाइमर (मेनू को छोड़कर) को Esc कुंजी का उपयोग करके रोका जा सकता है। सभी उदाहरण टाइमर "प्राकृतिक" (सार नहीं) पर भरोसा करते हैं मैं++) उलटी गिनती - समय या दूरी। सभी "घड़ियाँ" विशेष रूप से डीसिंक्रनाइज़ की गई हैं (स्पष्टता के लिए)। दूरी-निर्भर टाइमर का उपयोग "संकेतक" और ड्रॉप-डाउन ("पुल-आउट") मेनू में किया जाता है।

ड्रॉप डाउन मेनू

हमारा स्लाइडिंग मेनू वास्तव में ("हेडर" के नीचे से) स्लाइडिंग है: तत्वों के बीच विशेष रूप से अंतराल छोड़ा जाता है ताकि आप देख सकें कि यह कैसे स्लाइड करता है। अप्रत्याशित रूप से, यह पता चला कि हम अलग-अलग लंबाई की सूचियों के लिए समान रूप से सहज निकास नहीं बना सके - शायद कम कंप्यूटर प्रदर्शन के कारण ( एएमडी एथलॉन 999 मेगाहर्ट्ज)।

यह बिल्कुल स्पष्ट है कि सुंदरता और सद्भाव के लिए यह आवश्यक है कि विभिन्न मेनू आइटमों की सूचियाँ एक ही समय में दिखाई दें। यानी, लंबी सूचियां और अधिक के साथ बाहर हो जानी चाहिए उच्च गति, छोटे वाले - कम गति पर। ऐसा प्रतीत होता है कि इसे इस प्रकार कार्यान्वित किया जा सकता है:

  1. हमने कुल "प्रस्थान" समय निर्धारित किया है, उदाहरण के लिए, 200 एमएस।
  2. यदि ड्रॉपडाउन सूची की ऊंचाई 20 px है, तो यह स्पष्ट है कि हम इसे प्रति 10 एमएस अंतराल पर एक पिक्सेल नीचे ले जा सकते हैं - और फिर 200 एमएस में पूरी सूची सामने आ जाएगी।
  3. यदि ड्रॉपडाउन 40px ऊंचा है, तो समान समय में फिट होने के लिए हमें इसे हर 5ms में एक पिक्सेल नीचे ले जाना होगा।

इस तर्क के अनुसार, यदि ड्रॉपडाउन सूची 200px ऊंची है, तो हमें इसे प्रत्येक 1ms में एक पिक्सेल नीचे ले जाना चाहिए। लेकिन ऐसी गति हमारे कंप्यूटर पर काम नहीं करती - ब्राउज़र के पास एक मिलीसेकंड में सूची की नई स्थिति खींचने का समय नहीं होता है। हाँ। जावास्क्रिप्ट गिनने का प्रबंधन करता है (गिनने के लिए क्या है?), लेकिन ब्राउज़र (फ़ायरफ़ॉक्स) के पास प्रदर्शित करने का समय नहीं है। वेब के लिए विशिष्ट स्थिति.

इसलिए, केवल बैसाखी की मदद से मेनू प्रस्थान समय को कम या ज्यादा बराबर करना संभव है, और यह अभी भी स्पष्ट नहीं है कि यह अधिक के लिए कैसे काम करेगा तेज़ कंप्यूटर. लेकिन हमें सबसे धीमे वाले पर भरोसा करना चाहिए, है ना? एल्गोरिथ्म (कंप्यूटर की गति को ध्यान में रखे बिना) कुछ इस तरह निकलता है:

  1. सूची की जाँच के लिए कुल समय निर्धारित करें: समय = 224 (एमएस)।
  2. हम चक्र में एक अंतराल के लिए न्यूनतम समय निर्धारित करते हैं: विलंब = 3 (एमएस)।
  3. सूची को स्थानांतरित करने के लिए न्यूनतम चरण निर्धारित करें: ऑफसेट = 1 (पीएक्स)।
  4. हम सूची की ऊंचाई के आधार पर यह सब बदलते हैं: 1) विलंब (अंतराल) समय को ऊंचाई के विपरीत अनुपात में और कुल समय समय के सीधे आनुपातिक में बढ़ाएं (224 की ऊंचाई पर गुणांक 1 है); 2) यदि ऊंचाई 40 पीएक्स से अधिक है, तो ऊंचाई के अनुपात में न्यूनतम कदम बढ़ाएं। सबसे धीमे कंप्यूटर के लिए प्रयोगात्मक रूप से स्थिरांक "40" प्राप्त किया गया था। पेंटियम 4 सीपीयू 2.53 गीगाहर्ट्ज़ कंप्यूटर पर परीक्षणों से बिल्कुल वही संख्या सामने आई - 40। अन्यथा, टाइमर क्रम से बाहर हो जाते हैं, सूचियाँ क्रम से बाहर हो जाती हैं।

अब कमोबेश सूचियां सामने आ रही हैं. कमोबेश ऐसे ही समय के लिए. setinterval.htm पेज पर।

और यहाँ ब्रूस आता है:

फ़ंक्शन स्लाइड_डू(ओबीजे, मैक्सटॉप, ऑफसेट) (यदि (गेटटॉपलेफ्ट(ओबीजे).टॉप< maxtop) { obj.style.top = getTopLeft(obj).top + offset } else { if (obj && obj.timer1) { clearInterval(obj.timer1) obj.timer1 = null } } }

फ़ंक्शन स्वयं, जो नेस्टेड सूचियों को मेनू से बाहर धकेलता है, जैसा कि हम देख सकते हैं, बहुत सरल है। जो कुछ बचा है उसे इस पंक्ति के साथ चलाना है:

Ts.timer1 = setInterval(function())(slide_do(ts, maxtop, offset)), देरी)

खैर, शुरू करने से पहले, बस इन सभी मैक्सटॉप और ऑफसेट की गणना करें, और सूची को मिंटॉप स्थिति में भी रखें। "प्रारंभिक" फ़ंक्शन क्या करता है? फिसलना()आकार में 40 पंक्तियाँ. और सभी एक साथ - फ़ाइल setinterval.js में। हाँ, और यह बेकार चीज़ सम्मिलित शैलियाँ फ़ाइल के बिना बिल्कुल भी काम नहीं करेगी

  • से:
  • दर्ज कराई: 2014.07.08
  • पोस्ट: 3,896
  • पसंद है: 497

विषय: SetTimeOut और SetInterval, जावास्क्रिप्ट में किसका उपयोग करना बेहतर है?

नियमित अंतराल पर कोड को कई बार चलाने के लिए, फ़ंक्शन का उपयोग करें सेटअंतराल. हालाँकि, इसके कई नुकसान हैं, मुख्य रूप से अलग-अलग व्यवहार विभिन्न ब्राउज़र.

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

var d1 = नई तिथि(), d2 = नई तिथि(); setInterval(function() ( var d = new Date(); document.body.innerHTML += (d - d1) + " " + (d - d2) + "
"; // फ़ंक्शन की शुरुआत में एक निशान लगाएं d1 = new Date(); while (new Date() - d1< 200); // ничего не делаем 200 миллисекунд // И в конце функции d2 = new Date(); }, 1000);

दूसरी पंक्ति से प्रारंभ करके आउटपुट जानकारीपूर्ण होगा।

फ़ायरफ़ॉक्स, ओपेरा, सफारी और क्रोम में स्थिति समान होगी: पहली संख्या लगभग 1000 के बराबर होगी, दूसरी - 200 कम। अंतर केवल मूल्यों के प्रसार में होगा। सबसे छोटा अंतर क्रोम और ओपेरा में है।

2 द्वारा उत्तर दें पुनबीबी (PunBB 2017.06.08 16:45 द्वारा संपादित)

  • से: मॉस्को, सोवखोज़्ने 3, उपयुक्त। 98
  • दर्ज कराई: 2014.07.08
  • पोस्ट: 3,896
  • पसंद है: 497

एक और अंतर जो कम ध्यान देने योग्य है और पुन: उत्पन्न करने में अधिक कठिन है, लेकिन कभी-कभी बहुत परेशानी का कारण बन सकता है, सिस्टम समय परिवर्तनों का प्रतिरोध है। यदि आप निम्नलिखित परीक्षण चलाते हैं

सेटइंटरवल(फ़ंक्शन() ( document.body.innerHTML = Math.random(); ), 500);

और स्टार्टअप के बाद, सिस्टम समय को एक मिनट पीछे सेट करें, फिर फ़ायरफ़ॉक्स ब्राउज़रऔर Safari, नंबर परिवर्तन रुक जाएगा, और एक मिनट के बाद यह फिर से शुरू हो जाएगा। बेशक, सिस्टम समय का मैन्युअल अनुवाद एक अत्यंत दुर्लभ स्थिति है, लेकिन कई सिस्टम इंटरनेट पर सर्वर के साथ समय को स्वचालित रूप से सिंक्रनाइज़ करने के लिए कॉन्फ़िगर किए गए हैं, इसलिए कुछ स्थितियों में इस कारक को छूट नहीं दी जा सकती है।

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

3 द्वारा उत्तर दें पुनबीबी

  • से: मॉस्को, सोवखोज़्ने 3, उपयुक्त। 98
  • दर्ज कराई: 2014.07.08
  • पोस्ट: 3,896
  • पसंद है: 497

पुन: SetTimeOut और SetInterval, जावास्क्रिप्ट में किसका उपयोग करना बेहतर है?

सेटइंटरवल के सूचीबद्ध नुकसानों से छुटकारा पाने के लिए, आप एकाधिक सेटटाइमआउट का उपयोग कर सकते हैं।

सेटइंटरवल का एक महत्वपूर्ण विकल्प पुनरावर्ती सेटटाइमआउट है:

/** इसके बजाय: var timerId = setInterval(function() ( अलर्ट('टिक'); ), 2000); */ var टाइमरआईडी = सेटटाइमआउट (फ़ंक्शन टिक() ( अलर्ट ("टिक"); टाइमरआईडी = सेटटाइमआउट (टिक, 2000); ), 2000);

उपरोक्त कोड में, अगला निष्पादन पिछले निष्पादन के तुरंत बाद निर्धारित किया गया है।

रिकर्सिव सेटटाइमआउट, सेटइंटरवल की तुलना में अधिक लचीली टाइमिंग विधि है, क्योंकि वर्तमान निष्पादन के परिणामों के आधार पर, अगले निष्पादन तक का समय अलग-अलग निर्धारित किया जा सकता है।

उदाहरण के लिए, हमारे पास एक ऐसी सेवा है जो हर 5 सेकंड में नए डेटा के लिए सर्वर पर सर्वेक्षण करती है। यदि सर्वर अतिभारित है, तो आप मतदान अंतराल को 10, 20, 60 सेकंड तक बढ़ा सकते हैं... और फिर सब कुछ सामान्य होने पर इसे वापस लौटा सकते हैं।

यदि हम नियमित रूप से सीपीयू-गहन कार्य चलाते हैं, तो हम उनके निष्पादन पर खर्च किए गए समय का अनुमान लगा सकते हैं और अगले रन की योजना पहले या बाद में बना सकते हैं।

4 द्वारा उत्तर दें पुनबीबी

  • से: मॉस्को, सोवखोज़्ने 3, उपयुक्त। 98
  • दर्ज कराई: 2014.07.08
  • पोस्ट: 3,896
  • पसंद है: 497

पुन: SetTimeOut और SetInterval, जावास्क्रिप्ट में किसका उपयोग करना बेहतर है?

पुनरावर्ती सेटटाइमआउट कॉल के बीच विराम की गारंटी देता है, सेटइंटरवल नहीं।

आइए दोनों कोड की तुलना करें। पहला सेटइंटरवल का उपयोग करता है:

वर मैं = 1; सेटइंटरवल(फ़ंक्शन() ( func(i); ), 100);

दूसरा पुनरावर्ती सेटटाइमआउट का उपयोग करता है:

वर मैं = 1; सेटटाइमआउट(फ़ंक्शन रन() ( func(i); सेटटाइमआउट(रन, 100); ), 100);

सेटइंटरवल के साथ, आंतरिक टाइमर बिल्कुल हर 100 एमएस पर सक्रिय होगा और func(i) को कॉल करेगा:

सेटइंटरवल के साथ फंक कॉल के बीच वास्तविक ठहराव कोड में दर्शाए गए से कम है!

यह स्वाभाविक है, क्योंकि फ़ंक्शन के संचालन समय को किसी भी तरह से ध्यान में नहीं रखा जाता है; यह अंतराल के हिस्से को "खा जाता है"।

यह भी संभव है कि func हमारी अपेक्षा से अधिक जटिल निकला और निष्पादित होने में 100 एमएस से अधिक समय लगा।

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

यदि फ़ंक्शन सेटइंटरवल पॉज़ से अधिक समय तक चलता है, तो कॉल बिना किसी रुकावट के होगी।

5 द्वारा उत्तर दें सेम्पाई

  • से: यरूशलेम
  • दर्ज कराई: 2015.06.02
  • पोस्ट: 958
  • पसंद है: 274

पुन: SetTimeOut और SetInterval, जावास्क्रिप्ट में किसका उपयोग करना बेहतर है?

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

इस समय SetInterval का नुकसान यह है कि यह स्क्रिप्ट (फ़ंक्शन) के निष्पादन समय को ध्यान में नहीं रखता है, और यदि, उदाहरण के लिए, आप इसे भारी प्रश्नों के लिए उपयोग करते हैं, तो अंतराल समय काफी कम हो जाएगा, और यह विभिन्न ब्राउज़रों में भिन्न हो सकते हैं.

लेकिन फिर, यदि फ़ंक्शन या अनुरोध को छोटा कर दिया जाता है, तो अंतिम उपयोगकर्ता को अंतर महसूस होने की संभावना नहीं है।
इसलिए, क्या उपयोग करना है यह हर किसी को स्वयं तय करना है।



मित्रों को बताओ