4

次のコードを使用します。

HTML ファイル:

<!DOCTYPE html>

<html>

    <head>
        <title></title>
        <!--<script type="text/javascript" src="worker.js"></script>-->
        <script type="text/javascript" src="run.js"></script>
    </head>

    <body>
        <div id='log'></div>
    </body>

</html>

run.js:

window.onload = function(){

    var worker = new Worker('worker.js');

    var log = document.getElementById('log');

    log.innerHTML += "<p>"+"test"+"</p>";

    worker.addEventListener('message', function(e) {
        //alert(e.data);
        log.innerHTML += '<p>' + e.data + '</p>';
    }, false);

    for(var i=1; i<21;i++){
        worker.postMessage(i);
    }
};

worker.js

self.addEventListener('message', function(e) {
  self.postMessage(e.data);
}, false);

出力は 1 から 20 のリストであると予想されますが、run.js メッセージ リスナーでアラート呼び出しのコメントを外すと、代わりに 20 から 1 が出力されます。これは、アラートがページへの書き込みの遅延を引き起こし、メッセージ処理がスタックにバックアップされるため、最後にオンになったものが最初にオフになるためですか? またはそれは何か他のものです。

4

2 に答える 2

6

はい、これは「alert()」によるものです。ワーカーリスナーのブロック内でのコードのそれ以上の実行をブロックします。言い換えれば、コード:

log.innerHTML += '<p>' + e.data + '</p>';

アラートボックスのモーダルウィンドウの「OK」ボタンを押した後にのみ実行されます。押す順序で「log.innerHTML」が変更されるので、降順で押します。なぜこの結果が得られるのか。警告メッセージを使用しない場合は、すべてうまくいきます。

于 2012-05-05T07:47:28.343 に答える