2012-05-04 17 views
4

次のコード:ウェブワーカーのpostMessage工程順

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のリストを期待していますrun.jsメッセージリスナーでアラートコールのコメントを外すと、代わりに20対1が出力されます。これは、ページへの書き込みの遅れを引き起こすアラートとメッセージ処理がスタックにバックアップされるため、最後のものが最初のものであるためですか?それとも何か他のものですか?

+0

おもしろい事実:Firefoxでは、私が20,19,18、...をあなたの説明どおりに見ています。 Chromeでは1、2、3、... – h0b0

答えて

6

はい、これは「alert()」のためです。これは、ワーカーリスナのブロック内のコードのさらなる実行をブロックします。他の言葉で、コード:

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

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

+0

これは正解ではありません。なぜアラートはデータを逆に表示するのですか(20対1)?これはFirefoxでのみ発生します。 firefoxのようなものであるように見えますが、警告が出たときに突然スタックを使い始めます。この答えから何が起こっているのか明確ではない。 – tapananand

+0

@tapananandこれは、私が書いたように正解です。メッセージがログに書き込まれた順番でアラートが押されます。この場合、ブラウザは20のモーダルダイアログ(アラート)を開き、もう1つはfirefox残念ながら私たちはモーダルダイアログを動かすことはできませんが、可能ならば、2,1,15,3,2,0,5 ...のような任意の順序を達成することができます。 – micnic

+0

私が知る限り、警告同じスレッドでJSコードの実行を停止するので、一度に1つのアラートしか存在できません。したがって、すべてのアラートが一度に表示されるわけではありません。アラートが実行をブロックしない限り、私はそれを疑います。 – tapananand

関連する問題