यह निर्धारित करता है कि कौन से जावास्क्रिप्ट कार्य अवरुद्ध कर रहे हैं बनाम गैर-अवरुद्ध?


27

मैं कुछ वर्षों से वेब-आधारित जावास्क्रिप्ट (वेनिला जेएस, jQuery, बैकबोन, आदि) कर रहा हूं और हाल ही में मैं Node.js. के साथ कुछ काम कर रहा हूं। मुझे "नॉन-ब्लॉकिंग" प्रोग्रामिंग के हैंग होने में थोड़ा समय लगा, लेकिन मैंने अब आईओ ऑपरेशंस और व्हाट्सएप के लिए कॉलबैक का इस्तेमाल करने की आदत डाल ली है।

मैं समझता हूं कि जावास्क्रिप्ट प्रकृति द्वारा एकल-पिरोया गया है। मैं नोड "घटना कतार" की अवधारणा को समझता हूं। मुझे समझ में नहीं आता है कि क्या निर्धारित करता है कि क्या एक व्यक्तिगत जावास्क्रिप्ट ऑपरेशन "अवरुद्ध" बनाम "गैर-अवरुद्ध" है। मुझे कैसे पता चलेगा कि मैं बाद में कोड में उपयोग करने के लिए मेरे लिए एक आउटपुट का उत्पादन करने के लिए किस ऑपरेशन पर निर्भर हो सकता हूं, और जिन लोगों को मुझे कॉलबैक पास करना होगा, इसलिए प्रारंभिक ऑपरेशन पूरा होने के बाद मैं आउटपुट को प्रोसेस कर सकता हूं? कहीं जावास्क्रिप्ट कार्यों की एक सूची है जो अतुल्यकालिक / गैर-अवरोधक हैं, और उन लोगों की सूची है जो तुल्यकालिक / अवरुद्ध हैं? मेरे जावास्क्रिप्ट ऐप को एक विशाल दौड़ की स्थिति होने से क्या रोक रहा है?

मुझे पता है कि लंबे समय तक चलने वाले ऑपरेशन, जैसे नोड पर वेब में आईओ ऑपरेशन और वेब पर AJAX संचालन, उन्हें अतुल्यकालिक होने की आवश्यकता होती है और इसलिए कॉलबैक का उपयोग करते हैं - लेकिन कौन निर्धारित कर रहा है कि "लंबे समय" के रूप में क्या योग्यता है? क्या इन परिचालनों के भीतर किसी प्रकार का ट्रिगर है जो उन्हें सामान्य "ईवेंट कतार" से निकालता है? यदि नहीं, तो उन्हें सरल ऑपरेशनों से अलग क्या बनाता है जैसे कि वैरिएबल के मानों को वेरिएबल या लूपिंग के माध्यम से, जो ऐसा लगता है कि हम एक समकालिक तरीके से समाप्त करने के लिए निर्भर कर सकते हैं?

शायद मैं इस बारे में सही ढंग से नहीं सोच रहा हूँ - उम्मीद है कि कोई मुझे सीधे सेट कर सकता है। धन्यवाद!


यह कुछ ऐसा है जो मैंने पाया है कि यह वास्तव में उपयोगी है, भले ही आपके प्रश्न का उत्तर यह हो कि आपको यह पता लगाने के लिए कि क्या तरीके अनिवार्य हैं, दस्तावेज की जांच करनी है।
अनास्तासिया एंड्रोनिडिस

जवाबों:


13

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

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

सुनिश्चित करने के लिए कोई आयरनक्लाड तरीका नहीं है। यह या तो इंटरफ़ेस के काम करने के तरीके से एक फ़ंक्शन के लिए या स्पष्ट रूप से डॉक्टर में वर्तनी हो सकती है।

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


1
एक अतिरिक्त नोट के रूप में, कुछ जावास्क्रिप्ट फ़ंक्शन अपने मापदंडों के आधार पर अवरुद्ध और गैर-अवरुद्ध दोनों हैं। उदाहरण के लिए, XMLHttpRequest.openएक बूलियन asyncपैरामीटर है जो नियंत्रित करता है कि बाद में कॉल करना sendअतुल्यकालिक है या नहीं।
ब्रायन

मुझे यह उत्तर उपयोगी नहीं लगा और आम तौर पर समझाया गया।
मेहदी राश

@MehdiRaash - इसका उत्तर यह है कि आप इसे प्रलेखन से या इंटरफ़ेस से समझ रहे हैं। और कोई रास्ता नहीं है। यही कहता है। नहीं यकीन है कि आप और क्या उम्मीद कर रहे थे। कोई जादू की गोली का जवाब नहीं है।
२०

6

जो मैं समझता हूं कि आप इस बारे में नहीं पूछ रहे हैं कि आपको एसिंक्रोनस क्या बनाना चाहिए, लेकिन यह कैसे बताएं कि फ़ंक्शन असिंक्रोनस है या नहीं।

आप दस्तावेज़ की जाँच करें। गंभीरता से - कि यह क्या है। आप अंदाजा नहीं लगा सकते हैं कि कोई फ़ंक्शन उसके नाम या उसके संदर्भ के आधार पर क्या करता है। यदि आप निश्चित नहीं हैं और इसके स्रोत कोड तक पहुंच है, तो आप इसकी जांच करते हैं।

यह एकमात्र एकमात्र विश्वसनीय तरीका है।

अब मार्गदर्शन के लिए।

  • यदि यह एक कॉलबैक स्वीकार करता है या एक वादा करता है तो यह संभवतः अतुल्यकालिक है (मैंने उस नियम के अपवाद देखे हैं)
  • आमतौर पर वो सब कुछ जो I / O नोड से संबंधित है। सामान्य रूप से जावास्क्रिप्ट में और अधिक सामान्यतः एसिंक्रोनस रूप से किया जाता है (मैंने उस नियम के अपवाद भी देखे हैं)

4

चूंकि निम्न में से एक होने तक जावास्क्रिप्ट सभी प्रसंस्करण ब्लॉकों को पिरोया जाता है

1) वर्तमान निष्पादन एक बाहरी सेवा जैसे I / O या नेटवर्किंग अनुरोध, या एक वेबवर्क अनुरोध का अनुरोध करता है

2) एक फ़ंक्शन कॉल को एक टाइमर पर रखा जाता है जिसे बाद के समय में निष्पादित किया जाता है

अवरुद्ध / गैर-अवरुद्ध कार्यों की कोई सूची नहीं है। आपको दस्तावेज की जांच करनी चाहिए।

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

सामान्य तौर पर, कोड ब्लॉक को तब तक मानें जब तक कि कॉलबैक न हो। और यहां तक ​​कि अगर कोई कॉलबैक है, तो इसका मतलब यह नहीं है कि यह ब्लॉक नहीं होगा।


-1

मैं भी नोड.जेएस (और जावास्क्रिप्ट सामान्य रूप से) के लिए नया हूं और मुझे इतने अतुल्यकालिक कोड का उपयोग नहीं किया गया है। मैं सिर्फ यह बताना चाहता था कि नोड्ज पर ब्लॉकिंग बनाम नॉन-ब्लॉकिंग के अवलोकन में यह कहा गया है कि:

Node.js मानक लाइब्रेरी में I / O विधियों के सभी अतुल्यकालिक संस्करण प्रदान करते हैं, जो गैर-अवरुद्ध हैं, और कॉलबैक फ़ंक्शन स्वीकार करते हैं। कुछ तरीकों में अवरोधक समकक्ष भी होते हैं, जिनके नाम सिंक के साथ समाप्त होते हैं।


1
इस सवाल का पता कैसे पूछा जाता है? देखें कैसे जवाब दें
gnat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.