2012-04-26 5 views
3

私はこの優秀なスニペットを発見しましたMake my userscript wait for other scripts to load私はそれを呼び出す前に関数が利用可能になるのを待つ方法を示しています。私は同じことを行う必要があるとして私は一般的なjavascript "関数が利用可能になるのを待つ"が必要です

現在、私は私

waitForFnc(); 

function waitForFnc() { 
    if (typeof Portal.Management_Init == "undefined") { 
     window.setTimeout(waitForFnc, 50); 
    } 
    else { 
     Portal.Management_Init(); 
    } 
} 

のために働く私は一緒に入れている私のスクリプトでは、このローカルコードを持っているしかし、私は「waitForFnc」のジェネリック版を書きたいですいくつかの場所で物事。何かのように

waitForFnc(Portal.Management_Init); 

function waitForFnc(fnc) { 
    if (typeof fnc == "undefined") { 
     window.setTimeout(waitForFnc(fnc), 50); 
    } 
    else { 
     fnc(); 
    } 
} 

ここで私はそれが利用可能になったときに呼び出される関数の名前を渡します。上記のコードは機能しませんが、解決方法は不明です。

よろしくポール

答えて

2

何をしようとすると、いくつかの潜在的な問題があります。 Portalが定義される前にwaitForFnc()を呼び出すと、nullプロパティアクセス例外が発生します。真に汎用的な解決策を試しているのであれば、おそらくeval()* gasp *を使用しなければならないでしょう。

私たちは、待っている関数に引数を渡すためのサポートを追加しましょう。

function waitForFn(fnName, args){ 
    var fn; 
    try{ 
     eval("fn = " + fnName); 
     if(fn){ 
      fn.apply(null, args); 
     }else{ 
      setTimeout(function(){waitForFn(fnName, args);}, 50); 
     } 
    }catch(e){ 
     setTimeout(function(){waitForFn(fnName, args);}, 50); 
    } 
} 

waitForFn("Portal.Management_Init", [arg0, arg1]); 
+0

この回答をありがとう、それは私のために完全に働いた。 –

3

基本的に、コード行が実行される:タイムアウトが設定される前window.setTimeout(waitForFnc(fnc), 50);、「waitForFnc」が評価されます。呼び出しステートメントをパラメータとして渡す必要があります。

これは、それは、あなたが変数にそれを書きたい場合と同じように関数を定義しない何
window.setTimeout(function() {waitForFnc(fnc);}, 50); 

var myFunc = function() { 
    waitForFnc(fnc); 
}; 

この機能がある。ここ

は、あなたがそれを行う方法ですまだ実行されていない場合にのみ定義されます。次に、 "setTimeout"に "setTimeout"を渡します:

window.setTimeout(myFunc, 50); 

これは、 "setTimeout"が50msec後に実行するようにします。それが起こると、それはwaitForFnc(fnc)と呼ぶでしょう。クロージャと

window.setTimeout(waitForFnc(fnc), 50); 

window.setTimeout(function() {waitForFnc(fnc)}, 50); 

をしかし、あなたは、このような奇妙なコードが必要なのか、なぜ私が尋ねることができるあなたのコードで

0

を置き換えますか?私はむしろ、いくつかのコールバックを登録できるようにAPIを持っていることを期待する:

Portal.onManagementInitAvailable(fn); 
+1

明らかにあなたの期待はここで満たされませんでした。 – Chuck

+0

私はASP MVCを使用していますが、私は部分的にはajaxで動的にロードするビューを持っています。メインの部分ビュー内には、他の部分的なビューが時折見えるようになり、親の部分ビューによって動的にロードされる共通のJavaScriptを使用する必要があります。最初のページのロード時に、サブ部分ビューは、初期化ルーチンを呼び出す前にスクリプトがロードされていることを確認するために待機する必要があります。 –

0

ロードする内容によっては、require.jsを利用してこれを処理することができます。それは基本的に何のためです:http://requirejs.org/docs/why.html#9

関連する問題