2013-01-23 17 views
5

मेरे पास एक परिदृश्य है जहां मैंने विभिन्न मॉड्यूल लोड करने के लिए नेस्टेड() कॉल की आवश्यकता है।RequJS: नेस्टेड को कॉल की आवश्यकता होती है

क्या यह सुनिश्चित करने के लिए कोई तरीका है कि कॉलबैक फ़ंक्शन कहने से पहले सभी आवश्यकताएं() आमंत्रण और उसके सभी बच्चे की आवश्यकता होती है() आमंत्रण पूरी तरह से लोड हो जाते हैं?

क्या यह निर्दिष्ट करने का कोई तरीका है कि() कॉल सिंक्रोनस हैं?

function someFunction(callback) { 

    //top level require 
    require([...], function(...) { 

    //nested require 
    require([...], function(...) { 
    }); 

    //nested require 
    require([...], function(...) { 
    }); 

    }); 

    callback(); 
}; 
+0

क्या आप निर्भरताओं का उपयोग नहीं कर रहे हैं? – epascarello

+1

हां। हालांकि हम अपनी सामग्री को अलग फाइलों में अलग करने की कोशिश कर रहे हैं। उदाहरण के लिए उपरोक्त कोड FileA.js में है। FileB.js कॉलबैक के साथ कुछ फ़ंक्शन() को कॉल करता है। हालांकि, कॉलबैक की कुछ सेटिंग्स पर निर्भरता है जो FileA.js की आवश्यकता() कॉलबैक में होती है। समस्या यह है कि आवश्यकता की असीमित प्रकृति का मतलब है कि कॉलबैक को इसकी निर्भरता() सेट पर निर्भर होने से पहले निष्पादित किया जाता है। – user657352

उत्तर

3

आप पिछले require(...) समारोह में callback पर अमल करने की जरूरत है:

function someFunction(callback) { 
    require(['somemodule'], function(someModule) { 
    // do stuff with someModule... 

    // execute callback 
    callback(); 
    }); 
} 

क्या आप भी कर सकता है आपके dependencies with the define function निर्दिष्ट करने के लिए है।

उदाहरण:

define('somemodule', ['somedependency'], function(someDependency) { 
    // return somemodule 
    return { 
    someProperty: someDependency.getProperty(); 
    }; 
}); 

function someFunction(callBack) { 
    var someModule = require('somemodule'); 
    var foo = someModule.someProperty; 

    return callBack(foo); 
} 
2

वहाँ require कॉल सिंक बनाने के लिए एक तरीका है। इसे CommonJS शैली:

var module = require('modulepath') 

इसलिए, यदि आप नहीं अपने नेस्ट की आवश्यकता होती है कॉल में एक कारखाने funciton की आवश्यकता होगी, तो आप "सिंक" द कॉल कि जिस तरह से की आवश्यकता होती है सकते हैं ... लेकिन आप बाहर हैं, क्योंकि आप ऐसा करेंगे नसीब की।

एएमडी शैली requre(depsArray, factoryFn) बिल्कुल आपके कोड को समानांतर धागे में धक्का देने जैसा है। इसे "सिंक" बनाने का कोई तरीका नहीं है लेकिन परिणाम को समन्वयित करने के लिए आप "सेमफोर" का उपयोग कर सकते हैं।

आपके प्रश्न का उत्तर भी घोंसला वाले ए और नेस्टेड बी उपभोग पर निर्भर करता है। अगर वे ऊपर से कुछ उत्पाद पर निर्भर करती है की आवश्यकता होती है की तरह तो तुम बिल्कुल "थ्रेड सेमाफोर" का उपयोग करना चाहिए और सिर्फ परिभाषित नामित कॉल में नेस्टेड आवश्यकता कॉल धक्का नहीं कर सकते हैं:

function someFunction(callback) { 

    var resultOfOuterCode = someResultOfCalculations 

    //top level require 
    require([...], function(...) { 

    var resultOfTopRequireCode = someOtherResultOfCalculations 

    var semaphore = { 
     'count': 2 // represents the number of thread that need to be "done" before 
     , 'callback':callback // this callback is fired. 
     , 'checkIfLast': function(){ 
     this.count -= 1 
     if (!this.count) { 
      // count is now 0 - time to run our callback 
      this.callback() 
     } 
     } 
    } 

    //nested require A 
    require([...], function(...) { 
     // using resultOfTopRequireCode // <-- !!!! this is important part 
     ... 
     semaphore.checkIfLast() 
    }); 

    //nested require B 
    require([...], function(...) { 
     // using resultOfTopRequireCode // <-- !!!! this is important part 
     semaphore.checkIfLast() 
    }); 

    }); 

}; 

दूसरे शब्दों में, बस आवश्यकता होती है (dependsArray, factoryFn के बारे में सोच) "धागे" के रूप में और इसके लिए धागे का उपयोग करने की अपनी समझ लागू करें।

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