有一種方法,使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的)作爲「線程」,並將您對使用線程的理解應用於它。
你不應該使用依賴關係嗎? – epascarello
是的。不過,我們正試圖將我們的東西分成不同的文件。例如上面的代碼在FileA.js中。 FileB.js用它的回調調用someFunction()。但是它的回調函數依賴於FileA.js的require()回調函數中發生的一些設置。問題在於require的異步性質意味着回調在require()被設置的相關性之前被執行。 – user657352