2011-06-07 18 views
16

मैं अपने जावास्क्रिप्ट उपयोगिता जोर कार्य को एक चेतावनी() जोड़ने पर विचार कर रहा हूं।जेएस: समझें कि कैसे चेतावनी() ब्राउज़र ईवेंट लूप को प्रभावित करता है

हम एक अजाक्स-भारी एप्लिकेशन हैं, और जिस तरह से हमारा ढांचा (एक्स्ट) तैयार अंतराल == 4 की प्रतीक्षा करने के बजाय सेट इंटरवल के साथ AJAX प्रतिक्रिया के लिए मतदान करके AJAX लागू करता है, हमारे सभी AJAX कॉलबैक को निष्पादित करने का कारण बनता है सेट अंतराल स्टैक संदर्भ - और इसमें से एक अपवाद/जोर से बहने से आम तौर पर चुपचाप विफल हो जाता है।

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

आईआईआरसी: आप जिस अंतर के बारे में बात कर रहे हैं, उसे देखने के लिए आप एफएफ 2 और एफएफ 3.5 का उपयोग कर सकते हैं।

alert('1'); 
setTimeout(function(){alert('2');}, 10); 
alert('3'); 

एफएफ 3.5 1-3-2 दिखाता है। एफएफ 2 [1] 1-2 & 3 दिखाता है (2 और 3 एक दूसरे के शीर्ष पर एक साथ शीर्ष पर)। हम IE8 में 1-2 & 3 को दोबारा सक्रिय कर सकते हैं, एक चेतावनी के बजाय, एक चेतावनी के बजाय, जिसने दिन में वापस हमला किया था, और मैं यह सुनिश्चित करना चाहता हूं कि हम उस रास्ते को फिर से नीचे न जाएं ।

क्या कोई मुझे विशिष्ट निम्न स्तर के संसाधनों के बारे में बता सकता है जो इस व्यवहार को समझाते हैं, अपेक्षित व्यवहार क्या है, और निम्न स्तर पर वास्तव में क्या चल रहा है, जिसमें व्यवहार एफएफ संस्करणों में क्यों बदल गया है?

[1] आप इसे Spoon.net पर दोहराना कर सकते हैं जिसे मैं अभी काम नहीं कर सकता। मैंने इसे एफएफ 2.0.0.20 के साथ एक वीएम में दबा दिया।

+0

उत्कृष्ट प्रश्न। मेरे अनुभव में, 'अलर्ट' का कार्यान्वयन ब्राउज़र में नाटकीय रूप से भिन्न होता है। आम तौर पर, मैं 'अलर्ट' से बचूंगा जहां ये चीजें मायने रखती हैं और कस्टम (यानी jQuery UI-style) संवाद का उपयोग करती हैं। –

+0

@ ओलिवर - हाँ, हमने वास्तव में एक डोम-आधारित पॉपअप का उपयोग करना चुना, लेकिन मैं अब भी अलर्ट आंतरिक को समझना चाहता हूं। –

+1

* "परिभाषा के अनुसार संदेशबॉक्स को Win32 इवेंट लूप को पंप करने की अनुमति देनी चाहिए" * - कुछ ऑपरेटिंग सिस्टम - मैक ओएस एक्स, उदाहरण के लिए - नेस्टेड इवेंट लूप का उपयोग करें। एक चेतावनी एक [मोडल इवेंट लूप] (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/WinPanel/Concepts/UsingModalWindows.html) चला सकती है जो मुख्य ईवेंट लूप को अवरुद्ध करती है। ऐसा लगता है कि कुछ वेब ब्राउज़र संवाद बॉक्स के लिए कुछ समान करते हैं। – s4y

उत्तर

1

मैं 1-2 & 3 मामले को दोहराने में सक्षम नहीं हूं, लेकिन here एक ऐसा पहेली है जो आपको विभिन्न ब्राउज़रों में क्या चल रहा है, डीबग करने में मदद कर सकता है।

+0

कमाल उपकरण, धन्यवाद –

+0

@ डस्टिन गेटज़ कोई समस्या नहीं, उम्मीद है कि यह मदद करता है! – Briguy37

7

सबसे पहले, जावास्क्रिप्ट में टाइमर बहुत सटीक नहीं हैं। 30ms से छोटे अंतराल को सभी समान माना जा सकता है, और कार्यान्वयन अलग-अलग होते हैं। किसी भी अंतर्निहित आदेश पर भरोसा मत करो।

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

इस उदाहरण लें:

var hello = document.getElementById('hello') 

setTimeout(function(){ 
    hello.style.backgroundColor = 'lime' 
}, 5000) 

alert('Stop!') 

setTimeout(function(){ 
    hello.innerHTML = 'collaborate' 
}, 20) 

setTimeout(function(){ 
    hello.innerHTML = 'listen' 
}, 1000) 

दो संभावित परिणामों के होते हैं:

  1. आप 5 सेकंड से कम में चेतावनी बॉक्स को बंद करें। अनुवर्ती दो टाइमर निर्दिष्ट अंतराल पर सेट और आग लगाए जाएंगे। आप देख सकते हैं कि ईवेंट लूप रोक दिया गया है क्योंकि इस पर ध्यान दिए बिना कि आप कितनी देर तक अलर्ट बंद करने के लिए प्रतीक्षा करते हैं, "सुनो" हमेशा निष्पादित करने के लिए 1s लेगा।

  2. अलर्ट को बंद करने के लिए आपको 5 सेकंड से अधिक समय लगता है। पहला अंतराल (बीजीकॉलर) पारित हो जाएगा, इसलिए यह तुरंत समाप्त हो जाता है, इसके बाद दो टाइमर सेट और कॉल किए जाते हैं।

http://jsbin.com/iheyi4/edit

अंतराल के रूप में, जबकि घटना पाश यह भी बंद कर दिया है कि इस मामले में "समय बंद हो जाता है", तो:

i = 0 

setInterval(function(){ 
    document.getElementById('n').innerHTML = ++i 
}, 1000) 

setTimeout(function(){ 
    alert('stop') 
}, 5500) 

आप कितना समय लगेगा की परवाह किए बिना बंद करने के लिए चेतावनी, अगली संख्या हमेशा 6 होगी - setInterval कई बार आग नहीं जाएगी।

http://jsbin.com/urizo6/edit

+0

अच्छे अंक। 'एक अलर्ट() हमेशा ईवेंट लूप को रोक देगा, कम से कम, ब्राउज़र प्रक्रिया के Win32 संदेश पंप wm_paint को संसाधित कर रहा है क्योंकि अगर हम mbox को चारों ओर ले जाते हैं तो यह फिर से चला जाता है। क्या एफएफ 3 + में अंतराल इंतजार है क्योंकि wm_timer प्रसंस्करण नहीं कर रहे हैं, या जावास्क्रिप्ट वीएम के साथ कुछ फैंसी इंटरैक्शन की वजह से है? –

+0

@ डस्टिन: जावास्क्रिप्ट इवेंट लूप Win32 इवेंट कतार से स्पष्ट रूप से अलग है (Win32 में कोई अंतर्निहित पाश नहीं है)। मुझे पूरा यकीन है कि WM_TIMERs सामान्य रूप से हर समय संसाधित होते हैं, केवल जिस तरह से जावास्क्रिप्ट टाइमआउट लागू होते हैं, यह अलग दिखाई देता है। –