2012-07-20 7 views
5

मुझे कुछ बहुत ही अजीब व्यवहार चल रहा है। मेरे पास निम्न JQuery है:क्या जेएस डीबगर पूरे जेएस इवेंट लूप को निलंबित करता है?

myElement.fadeOut(100); 

किसी प्रकार की दौड़ की स्थिति चल रही है, जैसे कि तत्व छुपा हुआ नहीं है। अगर मैं उस रेखा पर एक डीबगर डालता हूं और कोड के माध्यम से कदम उठाता हूं, तो यह ठीक काम करता है और तत्व बाहर निकलता है और छुपा रहता है। इसे Heisenbug पर कॉल करें।

मेरा प्रश्न दौड़ की स्थिति प्रति से के बारे में नहीं है। मैं जानना चाहता हूं कि जावास्क्रिप्ट रनटाइम की प्रकृति को देखते हुए यह कैसे संभव है। मेरी समझ से निम्नलिखित विधेय सत्य हैं:

  1. fadeOut() JQuery animate()
  2. animate() द्वारा कार्यान्वित किया जाता setTimeout() कॉल
  3. setTimeout() कार्यक्रम में एक समारोह के निष्पादन की एक श्रृंखला से कार्यान्वित किया जाता है समय पर किसी बिंदु पर एक कतार
  4. जब घटनाएं कतार की शुरुआत तक पहुंच जाती हैं, तो फ़ंक्शन निष्पादित किया जाता है।
  5. केवल एक ईवेंट लूप है, जो अनुक्रमिक रूप से निष्पादित करता है।
  6. किसी भी समय दिए गए बिंदु पर, कॉलस्टैक के माध्यम से केवल एक फ़ंक्शन/पथ निष्पादित हो रहा है।

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

मैं नहीं देख सकता कि इन परिस्थितियों में दौड़ की स्थिति के लिए यह कैसे संभव है। क्या आप सुझाव दे सकते हैं कि निष्पादन के लिए डीबग किए गए और गैर-डीबग किए गए कोड के बीच अंतर कैसे हो सकता है?

उत्तर

2

आपका बुलेट बिंदुओं ठीक कह रहे हैं, ब्राउज़र इसका समर्थन करता है, तो सिवाय इसके कि requestAnimationFrame()setTimeout() के बजाय प्रयोग किया जाता है।

एक डीबगिंग सत्र आपके कोड के व्यवहार पर असर डाल सकता है, उदाहरण के लिए, myElement को AJAX कॉल द्वारा असीमित रूप से बनाया गया है लेकिन fadeOut() को पूरा करने के अनुरोध के बिना कॉल किया जाता है।

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

+0

आह आप जानते हैं कि, AJAX लोड क्या है। यह हो सकता है ... – Joe

+0

सफलता या पूर्ण कॉलबैक का उपयोग करें, टाइमआउट नहीं, अगर ऐसा हो रहा है। हमेशा एजेक्स थोड़ा सा लटका सकता है मान लें। –

+0

मैं निश्चित रूप से उस उद्देश्य के लिए एक टाइमआउट का उपयोग नहीं किया था! – Joe