2

ご覧いただきありがとうございます。

バックグラウンド

クライアント用に JavaScript を多用するアプリを作成しており、条件とコールバック関数を渡すことができるユーティリティ関数が必要です。条件が満たされない場合は、数ミリ秒待ってから再度テストする必要があります。条件が満たされた場合、コールバックを実行します。

私がこれまでに持っているもの

このメソッドをユーティリティ クラスの一部として記述しました。

 ThreadLocker: function (condition, callback) {
        //If condition is true then it resumes running code
        if (condition()) {
            callback();
        } else { //Else it waits 10ms and tries again
            setTimeout(Util.ThreadLocker(condition,callback), 10);
        }
    }

使用方法は次のとおりです。

   var condition = function(){return (myGlobalVariable == "foo") ? true : false;};
   var callback = function(){alert("Ready to rock!");};

    Util.Threadlocker(condition,callback);

問題

タイムアウト期間を 10に設定しても、すぐにスタック オーバーフローが発生します。これがChromeが私に与えるものです:

「コール スタックの最大サイズを超えました。」

スタックを見ると、setTimeOut が 10 秒に設定されていたとしても、1 ミリ秒または 2 ミリ秒の間に関数が数十回呼び出されたように見えます。

ここで何が間違っていますか?

4

1 に答える 1

3

この線

setTimeout(Util.ThreadLocker(condition,callback), 10);

'ThreadLocker'関数を直接呼び出します。タイムアウトは設定されていません。試す

setTimeout(function () { Util.ThreadLocker(condition,callback); }, 10);

また、javaScriptはマルチスレッドではないことを知っておく必要があるかもしれません。nミリ秒後、または他に何も実行されないとすぐに関数をディスパッチするだけです。間隔についても同じです。10msの間隔を作成すると、タスクには30msが必要で、開始から10ミリ秒、次に40ミリ秒(最初のタスクが終了した直後)に実行されます。

したがって、実際にロックすることはできませんが、コードを競合させることはできません。

スタックオーバーフローについて:あなたが本当にケースを持っているなら、例えば。500万行のスタックをオーバーフローする可能性のある再帰関数(IEでは、ページの読み込み中に実行されるJavascript行の数)、0のタイムアウトを使用して関数を延期できます。

setTimeout(function () { }, 0);

これは、アンダースコアの延期が機能する方法でもあります。

于 2013-03-01T00:49:30.910 に答える