2

inefficientProcess()大量のメモリを消費するを使用する次のコードがあります。

私の目標は、何らかのsetTimeout(function(){...},0)手法を使用して、コードの実行中にブラウザーがスタックしないようにすることです。

setTimeout で動作するようにコードを変更するにはどうすればよいですか?

function powerOfTwo(num) {
    inefficientProcess();
    if (num > 0) {
        return powerOfTwo(num-1)*2;
    } else {
        return 1;
    }
}

function inefficientProcess() {
    var sum;
    for (var i=0; i < 500000; i++) {
        sum+=10;
    }
}

powerOfTwo(1000);

私の目標はもちろん、重い計算を実行するときにブラウザーがクラッシュするのを避ける方法を学ぶことです。

4

3 に答える 3

3

Javascriptはシングルスレッドであり、すべてのコードがブロックされています。HTML5には新しい標準であるWebWorkersAPIがあり、タスクを別のスレッドに委任できます。次に、結果とともに実行されるコールバック関数を渡すことができます。

https://developer.mozilla.org/en-US/docs/DOM/Using_web_workers

簡単な例:

function powerOfTwo(num, callback) {
    var worker = new Worker('inneficient.js');
    worker.postMessage('runTask');
    worker.onmessage = function(event) {
        var num = event.data.result;
        var pow;
        if (num > 0) {
            pow = Multiply(num-1)*2;
        } else {
            pow = 1;
        }
        callback(pow);
    };    
}

powerOfTwo(1000, function(pow){
    console.log('the final result is ' + pow);
});

inneficient.jsには、次のようなものがあります。

//inneficient.js

function inefficientProcess() {
    var sum;
    for (var i=0; i < 500000; i++) {
        sum+=10;
    }
     postMessage({ "result": sum});
}

inefficientProcess();
于 2013-02-25T18:20:44.717 に答える
2

アンドレの回答で述べたように、別のスレッドでタスクを開始できるようにする新しい HTML5 標準があります。それ以外の場合は、時間を 0 にして setTimeout を呼び出して、inefficientProcess が呼び出される前に、現在の実行パスが終了する (およびおそらくいくつかの UI 変更がレンダリングされる) ようにすることができます。

しかし、HTML5 を使用できるかどうかに関係なく、powerOfTwo 関数は非同期になるように変更する必要があります。これを呼び出す人は誰でも、(a) WebWorkers を介してスピンアップされたスレッドが戻ったとき、または (b) setTimeout メソッドが終了します。

例を追加するために編集:

function powerOfTwo(num, callback)
{
    setTimeout(function ()
    {
        inefficientProcess();
        if (num > 0)
            callback(Multiply(num-1)*2);
        else
            callback(1);
    }, 0);
}

function inefficientProcess() { ... }
于 2013-02-25T18:23:59.153 に答える
0

HTML要素を使用すると、ページ内のJavaScriptコードの実行を開始するタイミングを定義できます。「async」属性と「defer」属性が9月上旬にWebKitに追加されました。Firefoxはすでにかなり前からそれらをサポートしています。

このサイトでそれを見た

于 2013-02-25T18:25:59.753 に答える