2013-01-23 48 views
5

我有一個場景,我嵌套require()調用來加載不同的模塊。RequireJS:嵌套的require調用

有沒有一種方法可以確保所有的require()調用及其所有的子require()調用在調用回調函數之前完全加載?

有沒有辦法指定require()調用是同步的?

function someFunction(callback) { 

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

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

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

    }); 

    callback(); 
}; 
+0

你不應該使用依賴關係嗎? – epascarello

+1

是的。不過,我們正試圖將我們的東西分成不同的文件。例如上面的代碼在FileA.js中。 FileB.js用它的回調調用someFunction()。但是它的回調函數依賴於FileA.js的require()回調函數中發生的一些設置。問題在於require的異步性質意味着回調在require()被設置的相關性之前被執行。 – 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') 

所以,如果你不需要在您需要嵌套調用工廠功能可按,你可以「同步」的要求調用這樣......不過既然你做,你都出來了的運氣。

AMD風格requre(depsArray, factoryFn)就像將您的代碼推入並行線程一樣。沒有辦法使其「同步」,但可以使用「信號量」來協調結果。

您的問題的答案也很大程度上取決於嵌套的A和嵌套的B消耗。如果他們依靠從上一些產品的要求一樣,所以你絕對必須使用「線程信號量」,不能只是把嵌套需要調用到一個名爲定義來電:

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的)作爲「線程」,並將您對使用線程的理解應用於它。