2

読み取る必要がある変数がロードされる前に実行されるスクリプトがあります..

これは最初に実行される私のスクリプトです

funcThatWaits(varToWait).ready(function(){
        //callback time!!
    alert("varToBeWait is Ready!!");
});

これが次にロードされるスクリプトです

var varToWait=null;

私が望むのは、変数が存在するのを待つ関数を作成し、変数が既に存在することを検出したときに自動的にコールバックを行うことです.(これは、変数が存在しない間は待機することを意味します)

これは可能ですか?私の最初のスクリプトは、DOM が完全にロードされるのを待つ jquery の $(document).ready() 関数に完全にコピーされています...これは JS 変数で可能ですか?

4

2 に答える 2

2

変数が別の関数 (およびおそらく別のスコープ) から取得された場合、コールバックを渡して、2 番目の関数がコールバックを実行するときに変数を提供できます。いつ存在するかを待つ必要はありませんが、2 番目のスクリプトがそれを提供するまで待つ必要があります

//in the second script:

var varIWant = 'foo'

function fromSecondScript(callback){
    callback(varIWant);
}

//in the first script:

function fromFirstScript(){
    fromSecondScript(function(theVar){
        //"theVar" in this function scope is "varIWant" from the other scope
    })
}

これを行う別の方法は、事前に定義されたローダー スクリプトを使用して、コールバックを集約し、変数が設定されたらそれらを呼び出すことです。

var aggregator = (function(){
    var stored = {};

    return {
        //adds a callback to storage
        addCallback : function(varName,callback){
            if(!stored.hasOwnProperty(varName)){
                stored[varName] = [];
            }
            stored[varName].push(callback);
        },
        //executes stored callbacks providing them data
        execute : function(varName,data){
            if(stored.hasOwnProperty(varName)){
                for(var i=0;i<stored[varName].length;i++){
                    stored[varName][i](data)
                }
            }
        }
}());

//in the first script add callbacks. you can add any number of callbacks
aggregator.addCallback('VarExists',function(theVar){
    //do what you want when it exists
});

aggregator.addCallback('VarExists',function(theVar){
    //another callback to execute when var exists
});

//in the second script, execute the callbacks of the given name
aggregator.execute('VarExists',theVarYouWantToShare);
于 2012-04-17T09:13:13.480 に答える