2013-02-13 39 views
27

मैं वैकल्पिक रूप से मॉड्यूल को परिभाषित करने में सक्षम होना चाहता हूं और फिर इसे अपने कोड में उपयोग कर सकता हूं या नहीं। मैं जिस विशेष स्थिति पर विचार कर रहा हूं वह डीबग/टेस्ट पर्यावरण में नकली/स्टब मॉड्यूल लोड कर रहा है लेकिन जब मैं लाइव नहीं हूं।requjs के साथ यह जांचना संभव है कि मॉड्यूल को लोड करने का प्रयास किए बिना परिभाषित किया गया है या नहीं?

html फ़ाइल जे एस फ़ाइलें वैकल्पिक रूप से लोड किया जा सकता है (छद्म कोड) में:

//index.cshtml 
... 
<script src="/Scripts/lib/require.js"></script> 
<script src="/Scripts/app/service_user.js"></script> 
<script src="/Scripts/app/real_service.js"></script> 
#if DEBUG 
<script src="/Scripts/app/mock_service.js"></script> 
#endif 

में दोनों real_service और mock_service ऊपर डिबग संस्करण में लोड किया जाना चाहिए यहाँ उदाहरण है।

प्रत्येक मॉड्यूल requirejs का उपयोग कर, जैसे परिभाषित किया जाएगा: की जाँच करने के

//mock_service.js 
define('mock_service', [], 
    function() { 
     ... 
    }); 

//real_service.js 
define('real_service', [], 
    function() { 
     ... 
    }); 

फिर जब सेवा का उपयोग कर रहा चाहें तो mock_service परिभाषित किया गया है:

//service_user.js 
define(['require', 'real_service'], 
    function (require, real_service) { 
     if (require.isDefined('mock_service')) { // 'isDefined' is what I wish was available 
      var mock = require('mock_service'); 
      mock.init(real_service); 
     } 

     ... 
    }); 

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

मेरे लिए महत्वपूर्ण बात यह है कि वैकल्पिक मॉड्यूल को लोड करने का कोई प्रयास नहीं किया जाता है। मैं आवश्यकता कथन के चारों ओर कोशिश/पकड़ सकता हूं लेकिन इससे सर्वर से इसे लोड करने का प्रयास होगा और मुझे वह नहीं चाहिए।

एक और विकल्प यह तय करना होगा कि मैं हमेशा लोड करता हूं और इसलिए हमेशा एक नकली आवश्यकता होती है जिसके लिए मैं पूछताछ कर सकता हूं कि यह वास्तविक है या नहीं, लेकिन यह भी अपमानजनक लगता है।

क्या वहां कोई भी है जो आवश्यकतानुसार गहराई से है। जेएस ने पाया है कि उन्हें इस कार्यक्षमता की आवश्यकता है और कार्यान्वयन के लिए एक रणनीति तैयार की है?

अग्रिम धन्यवाद, रोब

उत्तर

41

हालांकि डेविड वुल्फ का जवाब उस चिह्न के करीब था, लेकिन यह मेरी आवश्यकताओं को पूरा नहीं करता था।

समस्या यह है कि अतुल्यकालिक रूप से आवश्यकताओं को हल करने की आवश्यकता होती है, उदाहरण में मैंने डेविड के सुझाव दिए और उदाहरण का उपयोग require.defined('mock_service')false वापस कर दिया होगा क्योंकि यद्यपि यह निर्दिष्ट किया गया है कि इसे अभी तक हल नहीं किया गया है।

इसकी जांच करते समय मुझे एक और फ़ंक्शन specified मिला। उदाहरण में require.specified('mock_service')true लौटाएगा लेकिन फिर require('mock_service') का उपयोग कर संदर्भ प्राप्त करने का प्रयास विफल हो गया है क्योंकि यह अभी तक हल नहीं हुआ है।

कि, सौभाग्य से, आवश्यकता के कॉलबैक संस्करण का उपयोग करके आसानी से तय किया जाता है। इसे सभी को एक साथ रखकर हमारे पास है:

if (require.specified('mock_service')) { 
    require([ 'mock_service' ], function (mock) { 
     mock.init(real_service); 
    }); 
} 

@ डेविड वुल्फ - धन्यवाद, आपकी मदद के बिना वहां नहीं पहुंचेगा।

56

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

// returns true 
require.defined("my/awesome/defined/module"); 

// returns false 
require.defined("not/yet/loaded"); 
+0

Thx - यह लगभग मेरी ज़रूरतों को पूरा करता है और मुझे सही उत्तर खोजने में मदद करता है जिसे मैंने अभी जोड़ा है और पूर्ण समाधान के रूप में चिह्नित किया है। – WooWaaBob

+0

+1 महान उत्तर और एक अच्छी सुविधा, इस बारे में नहीं पता था! – thomaux

+0

सिर्फ उत्सुक, यदि बादाम संस्करण में कोई विकल्प है? –