11

मुझे आश्चर्य है कि मुझे इसका स्पष्ट उत्तर नहीं मिल रहा है। तो, jQuery में, आप यह कर सकते हैं:jQuery में एसिंक्रोनस फ़ंक्शन कैसे हैं?

$(someElements).fadeOut(1000); 
$(someElements).remove(); 

कौन सा, एक fadeOut एनीमेशन शुरू कर देंगे, लेकिन इससे पहले कि यह 1 सेकंड की अवधि में निष्पादित नहीं हो, तत्वों डोम से हटा दिया जाता है। लेकिन यह कैसे संभव है? मैं जावास्क्रिप्ट को पढ़ना जारी रखता हूं एकल धागा (यह भी देखें: Is JavaScript guaranteed to be single-threaded?)। मैं जानता हूँ कि मैं या तो कर सकते हैं:

$(someElements).fadeOut(1000).promise().done(function() { 
    $(someElements).remove(); 
}); 

या और भी बेहतर:

$(someElements).fadeOut(1000, function() { 
    $(this).remove(); 
}); 

मैं क्या समझ में नहीं आता एक "एकल सूत्र" में कैसे जावास्क्रिप्ट चलाता है, लेकिन मैं इन jQuery उपयोग करने में सक्षम हूँ कार्य जो असीमित रूप से निष्पादित करते हैं और स्पष्ट रूप से एक ही समय में विभिन्न स्थानों में डीओएम परिवर्तन देखते हैं। यह कैसे काम करता है? यह सवाल नहीं है: "मैं इसे कैसे ठीक करूं"।

+2

लघु जवाब लेने के एक तत्व है जो इसे पुन: प्राप्त करने किया जा सकता है या डेटा बदलने चेतन करने के लिए अन्य तत्वों के लिए एनीमेशन अप कतार: सीएसएस एनीमेशन या टाइमर। –

+0

मुझे लगता है क्योंकि jQuery एनीमेशन के लिए कतार का उपयोग करता है, यह कहीं भी दस्तावेज़ों में है .. – gpasci

उत्तर

5

jQuery एनिमेशन (और बहुत अधिक जावास्क्रिप्ट-आधारित एनिमेशन) अपने एनिमेशन को चलाने के लिए टाइमर का उपयोग करते हैं। .fadeOut() पर कॉल केवल एनीमेशन शुरू करता है और यह कुछ समय बाद पूरा नहीं होता है जब टाइमर ऑपरेशन की एक श्रृंखला होती है।

यह सब अभी भी सिंगल-थ्रेडेड है। .fadeOut() एनीमेशन का पहला कदम करता है, यह अगले चरण के लिए टाइमर सेट करता है और फिर शेष जावास्क्रिप्ट (.remove() समेत) पूरा होने तक चलता है। जब वह जावास्क्रिप्ट थ्रेड खत्म हो जाता है और टाइमर के लिए समय समाप्त हो जाता है, टाइमर आग और एनीमेशन का अगला चरण होता है। अंत में जब एनीमेशन के सभी कदम पूरे हो गए हैं, तो jQuery एनीमेशन के लिए समापन समारोह को कॉल करता है। यह एक कॉलबैक है जो आपको एनीमेशन पूरा होने पर कुछ करने की अनुमति देता है।

$(someElements).fadeOut(1000, function() { 
    $(this).remove(); 
}); 

आप एनीमेशन पूरा होने के समारोह का उपयोग करें और केवल आइटम जब एनीमेशन किया जाता है हटा दें:

कि कैसे आप इस समस्या को हल है।

+0

यदि आप एसिंक्रोनस निष्पादन चाहते हैं तो आप एक वेब वर्कर पर विचार कर सकते हैं या (वर्तमान में) प्रयोगात्मक नदी ट्रेल ओपनसीएल पुल का उपयोग कर सकते हैं यदि आप तीव्र डेटा प्रोसेसिंग कर रहे हैं। – FlavorScape

+0

मैं वास्तव में जेएसटीविन पसंद करता हूं क्योंकि यह किसी भी गुण को संभाल सकता है। – FlavorScape

+1

@ फ्लेवरस्केप - वेब कर्मचारी डोम के साथ बातचीत नहीं कर सकते हैं इसलिए वे एनिमेशन के लिए बहुत मदद नहीं कर रहे हैं। – jfriend00

1

jQuery में एक सेट इंटरवल हैंडलर है जो सभी पंजीकृत एनीमेशन गुणों में परिवर्तन करता है। आप AS3 से आ रहे हैं, एक EnterFrame हैंडलर के रूप में यह के बारे में सोच, या ओपन में एक ड्रा विधि की तरह

+0

के लिए जल्द ही मानकीकृत हो रही किया जाना चाहिए मैं jQuery के हाल के संस्करणों में सोचते हैं, यह/अद्यतन के रूप में requestAnimationFrame हैंडलर (ब्राउज़र द्वारा भेजा घटना) का उपयोग कर सकते समारोह आकर्षित – FlavorScape

+0

requestAnimationFrame है jQuery में और बाहर किया गया था। यह थोड़ी देर के लिए था, तो कुछ समस्याओं के कारण बाहर खींच लिया गया था। मैं वर्तमान में इसे 1.7 के संस्करण में नहीं देखता हूं जिसके लिए मेरे पास स्रोत खुला है। – jfriend00

+0

@ jfriend00 आप सही हैं http://stackoverflow.com/questions/7999680/why-doesnt-jquery-use-requestanimationframe – FlavorScape

0

आप delay() का उपयोग ca एक निश्चित समय के लिए प्रतीक्षा या एनीमेशन के लिए एक कॉलबैक का उपयोग करें, fadeOutanimate के साथ बदल करने के लिए । jQuery एनिमेट और कतारों के लिए setTimeout का उपयोग करता है।

0

वैसे ही ऑपरेटिंग सिस्टम 20 साल पहले बहु-कार्य करने वाले थे। वहां कोई धागा नहीं था, वहां केवल उन चीजों की एक सूची थी, जिन पर ध्यान और नियंत्रक की आवश्यकता थी जो सूची के आधार पर चीजों पर ध्यान दे।

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

यह इंटरप्ट कतार जैसी चीजों के बारे में बात नहीं करता है और ऐसे में सीपीयू का सामना करना पड़ सकता है, और मुझे यकीन नहीं है कि जावास्क्रिप्ट में कोई एनालॉग है, लेकिन एक साधारण स्तर पर, मुझे लगता है कि यह एक उचित प्रतिनिधित्व है।

0

सिंगल थ्रेडिंग के पास असीमित प्रोग्रामिंग के साथ कुछ लेना देना नहीं है। http://social.msdn.microsoft.com/Forums/uk/csharplanguage/thread/3de8670c-49ca-400f-a1dc-ce3a3619357d

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

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

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