AngularJS में $ evalAsync और $ timeout के बीच क्या अंतर है?


180

मैं थोड़ी देर के लिए AngularJS का उपयोग कर रहा हूं, और हर बार एक समय में $ timeout का उपयोग करने की आवश्यकता पाई है (आमतौर पर एक jQuery प्लगइन को लगता है)।

हाल ही में, मैं पाचन चक्र की बेहतर और अधिक गहराई से समझने की कोशिश कर रहा हूं, और मुझे $ evalAsync फ़ंक्शन मिला।

ऐसा लगता है कि फ़ंक्शन समान परिणाम उत्पन्न करता है $timeout, केवल आप इसे देरी नहीं देते हैं। जब भी मैंने इसका उपयोग किया है हर बार $timeout0 की देरी के साथ रहा है, इसलिए अब मैं सोच रहा हूं कि क्या मुझे $evalAsyncइसके बजाय इस्तेमाल करना चाहिए था ।

क्या दोनों के बीच कोई बुनियादी अंतर हैं? आप एक के बाद एक मामलों का क्या उपयोग करेंगे? मैं कब कौन सा उपयोग करना है इसका एक बेहतर एहसास प्राप्त करना चाहता हूं।

जवाबों:


263

मैंने हाल ही में अनिवार्य रूप से इस प्रश्न का उत्तर दिया है: https://stackoverflow.com/a/17239084/215945 (मिसको के साथ कुछ गितूब एक्सचेंजों के उत्तर लिंक।)

संक्षेप में:

  • यदि कोड एक निर्देश से $ evalAsync का उपयोग करके कतार में है , तो यह कोणीय द्वारा DOM के हेरफेर के बाद चलना चाहिए , लेकिन ब्राउज़र रेंडर करने से पहले
  • यदि कोड एक नियंत्रक से $ evalAsync का उपयोग करके कतारबद्ध है , तो यह कोणीय (और ब्राउज़र रेंडर करने से पहले) डोम द्वारा हेरफेर किए जाने से पहले चलना चाहिए - शायद ही आप ऐसा चाहते हैं
  • यदि कोड $ टाइमआउट का उपयोग करके पंक्तिबद्ध किया जाता है , तो यह एंगुलर द्वारा DOM के हेरफेर के बाद चलना चाहिए , और ब्राउज़र रेंडर करने के बाद (जो कुछ मामलों में झिलमिलाहट का कारण हो सकता है)

15
विवरण के लिए आपका धन्यवाद। एक बात मुझे यकीन नहीं है कि मैं समझ रहा हूँ। यदि आप नियंत्रक या निर्देश से $ evalAsync कॉल कर रहे हैं तो इससे क्या फर्क पड़ता है? AsyncQueue पता नहीं है कि क्या यह एक नियंत्रक या एक निर्देश से पंजीकृत किया गया था, यह सिर्फ वर्तमान गुंजाइश पर इसे कतार में खड़ा करता है। क्या यह तब होता है जब कोई नियंत्रक बनाम नियंत्रक में सामान चलता है? मैं सिर्फ उस हिस्से को समझना चाहता हूं।
dnc253

@ dnc253, मैंने कोणीय कोड को नहीं देखा है, इसलिए मुझे आपके (अच्छे) प्रश्न का उत्तर नहीं पता है। उम्मीद है कि कोई और टिप्पणी कर सकता है।
मार्क राजकोक

15
एक निर्देशन के लिंकिंग फ़ंक्शन से "एक निर्देश" का अर्थ "है"? या किसी निर्देश के लिंक या नियंत्रक विधि से निष्पादित होने पर व्यवहार का यह सच है?
सिंपलजी जूल 25'14

5
हाँ, यह वास्तव में स्पष्ट नहीं है कि "एक निर्देश से" और "एक नियंत्रक से" यहां क्या मतलब है
कांटा

1
@MarkRajcok, क्या आप यहां स्पष्ट कर सकते हैं: यदि कोड को एक निर्देश से $ evalAsync का उपयोग करके कतार में रखा जाता है, तो इसे Angular द्वारा DOM को हेरफेर करने के बाद चलाना चाहिए - क्या यह निर्देश के बाद DOM द्वारा हेरफेर किए जाने के बाद चलना चाहिए या अन्य निर्देशों द्वारा?
मैक्स कोर्सेटस्की

59

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

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

  • दूसरी ओर $ evalAsync (कॉलबैक) , कॉलबैक को वर्तमान, या अगले, पाचन चक्र में जोड़ देगा। जिसका अर्थ है कि यदि आप एक पाचन चक्र के भीतर हैं (उदाहरण के लिए किसी ng-clickनिर्देश से बुलाए गए कार्य में ), तो यह किसी भी चीज का इंतजार नहीं करेगा, कोड तुरंत निष्पादित किया जाएगा। यदि आप एक अतुल्यकालिक कॉल के भीतर हैं, उदाहरण के लिए asetTimeout , एक नया पाचन चक्र ( $apply) शुरू हो जाएगा।

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

यदि आप $ टाइमआउट, $ evalAsync, $ डाइजेस्ट, $ लागू होने के बीच अंतर के बारे में अधिक विवरण चाहते हैं, तो मैं आपको उस अन्य प्रश्न पर अपना उत्तर पढ़ने के लिए आमंत्रित करता हूं: https://stackoverflow.com/a/23102223/1501926

प्रलेखन को पढ़ना भी सुनिश्चित करें :

$ EvalAsync कोई गारंटी नहीं देता है कि जब अभिव्यक्ति निष्पादित होगी, तो केवल:

  • यह उस फ़ंक्शन के बाद निष्पादित करेगा जो मूल्यांकन निर्धारित करता है (अधिमानतः डोम रेंडरिंग से पहले)।
  • अभिव्यक्ति के निष्पादन के बाद कम से कम एक $ पच चक्र का प्रदर्शन किया जाएगा।

नोट: यदि इस फ़ंक्शन को $ डाइजेस्ट चक्र के बाहर कहा जाता है, तो एक नया $ डाइजेस्ट चक्र शेड्यूल किया जाएगा । हालांकि, यह हमेशा उस कोड को प्रोत्साहित किया जाता है जो $ लागू कॉल के भीतर से मॉडल को बदलता है। इसमें $ evalAsync के माध्यम से मूल्यांकन किया गया कोड शामिल है।


क्या आप बता सकते हैं कि यदि मुझे कुछ DOM विशेषता तक पहुँचने की आवश्यकता है तो $ समय की आवश्यकता क्यों है। मान लीजिए कि मेरे पास <टेबल की चौड़ाई = "{{x}}" है> तो एनजी-बिंद के वॉच फंक्शन मेमोरी में डोम विशेषता को अपडेट नहीं करता है, मुझे लगता है कि यह तब तक दृश्य को दोहराने का मौका नहीं देगा जब तक कि डाइजेस्ट साइकिल से बाहर नहीं निकलता।
श्रीधर चिदुरला

2
@SridharChidurala क्योंकि DOM ("HTML") पाचन चक्र के दौरान अद्यतन किया गया है, आपको इसके लिए इंतजार करना होगा इससे पहले कि आप mofifications को पढ़ सकें। हालांकि यह कोणीय द्वारा हतोत्साहित किया जाता है, आपको xअपने कार्यक्षेत्र से सीधे डोम के बजाय पढ़ना चाहिए , इसलिए आपको कुछ भी इंतजार करने की आवश्यकता नहीं है। इसके अलावा, आपको ng-styleअप्रचलित widthसंपत्ति के बजाय सीएसएस के साथ बेहतर उपयोग करना चाहिए । यदि आपको अधिक सहायता की आवश्यकता है, तो कृपया StackOverflow पर एक नया प्रश्न खोलें।
फ्लोरीबोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.