2013-01-23 20 views
5

私は、異なるモジュールを読み込むためにrequire()呼び出しを入れ子にしたシナリオがあります。RequireJS:ネストされた要求コール

コールバック関数が呼び出される前に、すべてのrequire()呼び出しとそのすべての子require()呼び出しが完全にロードされるようにする方法はありますか?

require()呼び出しが同期するように指定する方法はありますか?あなたが最後のrequire(...)機能でcallbackを実行する必要が

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

:あなたも何ができるか

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コール同期を行うための方法があります。あなたはませあなたの必要とネストされた通話の工場のfuncitonを必要とする場合

var module = require('modulepath') 

そう、あなたが「同期」インクルードが呼び出す方法を必要とする可能性がある...しかし、あなたが行うので、あなたはアウトです:作るそれがスタイルCommonJS運の

AMDスタイルrequre(depsArray, factoryFn)は、コードを並列スレッドにプッシュするのとまったく同じです。それを "同期"させる方法はありませんが、セマフォを使用して結果を調整することができます。

ネストされたAとネストされたBが消費するものにも大きく依存します。ちょうど必要(dependsArray、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() 
    }); 

    }); 

}; 

:彼らはトップからいくつかの製品に依存している場合ので、あなたは絶対に「ネジ付きセマフォ」を使用しなければならないとだけ定義という名前の呼び出しに必要とネストされた呼び出しをプッシュすることはできませんように必要)を「スレッド」として定義し、スレッドの使用方法を理解するために使用します。