5

この優れたスニペットMake my userscript wait for other scripts to loadを見つけました。これは、関数を呼び出す前に関数が使用可能になるのを待つ方法を示しています。

現在、スクリプトにこのローカルコードがあり、これをまとめて機能します

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();
    }
}

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

よろしくポール

4

4 に答える 4

4

あなたがやろうとしていることにいくつかの潜在的な問題があります。ポータルが定義される前に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]);
于 2012-04-26T07:55:02.100 に答える
3

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

その方法は次のとおりです。

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

これが行うことは、変数に書き込むのと同じ方法で関数を定義します。

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

この関数はまだ実行されておらず、定義されているだけです。次に、それを「setTimeout」に渡します。

window.setTimeout(myFunc, 50);

これにより、「setTimeout」が50ミリ秒後にその機能を実行します。そして、そうするとき、それは を呼び出しますwaitForFnc(fnc)

于 2012-04-26T07:27:53.400 に答える
0

コードを次のように置き換えます。

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

閉鎖あり:

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

しかし、なぜそのような奇妙なコードが必要なのですか? コールバックを登録できる API があることを期待したいと思います。

Portal.onManagementInitAvailable(fn);
于 2012-04-26T07:28:26.077 に答える
0

ロードするものによっては、require.js を利用してこれを処理できる場合があります。それは基本的にそれが目的です:http://requirejs.org/docs/why.html#9

于 2012-04-26T08:16:39.420 に答える