网络工作者发布消息处理顺序

web worker postMessage process order

本文关键字:消息处理 顺序 工作者 网络      更新时间:2023-09-26

使用以下代码:

文件:

<!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>

运行.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);
    }
};

工人.js

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

输出与我期望的列表一样 1 到 20,但是如果我在运行中取消注释警报调用.js消息侦听器,它会打印出 20 到 1。这是因为警报导致写入页面的延迟,并且消息处理在堆栈中备份,因此最后一个打开是第一个关闭的吗?还是别的什么。

是的,这是因为"alert()"。它阻止在工作线程侦听器块内进一步执行代码。换句话说,代码:

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

仅在按下警报框的模态窗口上的"确定"按钮后执行,按顺序按下它们,按此顺序"log.innerHTML"将被更改,因此您按降序按下它们,这就是您得到此结果的原因。如果您不使用警报消息,一切顺利。

我认为这是Firefox中的一个错误。我在 2020 年尝试过的任何浏览器中都没有看到这种行为:它们都从 1 到 20 排序。