2012-09-29 12 views
6

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

उत्तर

1

requireJS के लिए:

आप .require() करने के लिए आवश्यक मॉड्यूल, कि जब संसाधनों को सफलतापूर्वक लोड किया गया था निकाल दिया जाएगा के साथ एक कॉलबैक विधि पारित करने के लिए की है। तो, निश्चित रूप से आपको केवल उस कॉलबैक के भीतर लोड किए गए एएमडी या कॉमनजेएस मॉड्यूल तक पहुंच/कर सकते हैं।

NodeJS के लिए

:

हाँ, .require() तुल्यकालिक काम करता है। नोडजेएस कॉमनजेएस मॉड्यूल सिस्टम का उपयोग करता है, एएमडी नहीं।

2

यहां दो अलग-अलग synchronous अवधारणाएं हैं। पहला यह है "क्या यह मेरा पूरा वेबपृष्ठ बंद कर देगा, और बैठेगा और फ़ाइल के लिए प्रतीक्षा करेगा।"

उत्तर नहीं है। RequJS ऐसा नहीं करता है यदि आपके पास निर्भरताओं के साथ एक स्क्रिप्ट है।

यदि आप इसे उचित रूप से उपयोग करते हैं, तो यह एक वादा-प्रणाली का उपयोग करता है। इसका अर्थ यह है कि यदि आप अपनी कॉलबैक में भेजते हैं और उस फ़ाइल के लिए अपनी आवश्यकताओं को परिभाषित करते हैं, तो कॉलबैक तब तक नहीं चलेगा जब तक कि सभी आवश्यक फाइलें लोड नहीं हो जातीं।

यदि उन आवश्यक फ़ाइलों में से किसी एक के अंदर आवश्यकता है, तो कि कॉलबैक तब तक नहीं चलाया जाएगा जब तक इसकी निर्भरता लोड नहीं हो जाती।

बाहरीतम कॉलबैक (जो आपकी स्क्रिप्ट के नीचे सामान्य रूप से होगा), सब कुछ अंदर तक नहीं चलेगा।

यह एक वादे प्रणाली पर काम करता है। यह समझने योग्य है कि वादे सिस्टम कैसे काम करते हैं (एक पर्यवेक्षक-पैटर्न के समान, एक तरह से)। वे किसी भी क्रम में कई लोगों को सुनने के बजाय किसी घटना के आधार पर चारों ओर या चारों ओर पारित होने के लिए हैं।

var widget = new Widget(), 
    widgetLoaded = widget.load(url); // return a promise to let the program use the widget 

widgetLoaded.then(function() { widget.move(35); }) 
      .then(function() { widget.setColour("Blue"); }) 
      .then(function() { widget.show(); }); 

यह this तो लौटने की तरह है कि आप कर सकते हैं श्रृंखला फ़ंक्शन कॉल, सिवाय इसके कि कॉल वास्तव में widget.load() कम्प्लिट्स जब तक नहीं होती।

widget वास्तव में नियंत्रित होगा जब ऐसा होता है, अगर विजेट लोड होता है और सब कुछ ठीक है, या कुछ गलत होने पर अपना वादा तोड़कर।

सबसे वादा प्रणालियों में, .then या जो कुछ भी वे इसे या तो दो कार्यों लेता है (रखा और टूट - मेरे सिस्टम में, ब्रोकेंस हमेशा वैकल्पिक हैं), या वे success के साथ एक वस्तु लेने के लिए और failure - $.ajax करता है , और उसके बाद आप डेटा को लोड करते समय डेटा के साथ क्या करना चाहते हैं, या यदि यह विफल रहता है - वादे करता है।

तो आपका पृष्ठ अभी भी 100% असीमित रूप से काम करता है (यूआई को बाधित किए बिना), लेकिन यह 100% सिंक्रोनस है जिसमें सभी मॉड्यूल सही क्रम में आग लगेंगे।

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

यह केवल क्योंकि यह वास्तविक प्रसंस्करण के मामले में एक अतुल्यकालिक प्रक्रिया है, और चल घटनाओं/जे एस, पेज प्रतिपादन, वगैरह से ब्राउज़र ब्लॉक नहीं है।

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