Javascript ServiceWorker client.postMessage FIFO序列

Javascript ServiceWorker client.postMessage FIFO序列,javascript,multithreading,web-applications,output,service-worker,Javascript,Multithreading,Web Applications,Output,Service Worker,编辑:在没有调试的情况下,我似乎无法再现这一点,但我的测试并没有真正“广泛”。如果您能提供帮助,请查看以下工作示例的代码:-有一个aaa_readme.txt,它是非常直接的文档化代码。当然,关于已经讨论过的软件消息传递 我很肯定,我看到的只是Chrome调试器干预的副作用,加上我代码中的各种“警报”,但另一组眼睛或这方面的更多知识可能会解决我的问题,并指出我做错了什么 我所看到的是,非常偶然地,从ServiceWorker(postMessage)到达客户机(onmessage)的消息的顺序与

编辑:在没有调试的情况下,我似乎无法再现这一点,但我的测试并没有真正“广泛”。如果您能提供帮助,请查看以下工作示例的代码:-有一个aaa_readme.txt,它是非常直接的文档化代码。当然,关于已经讨论过的软件消息传递

我很肯定,我看到的只是Chrome调试器干预的副作用,加上我代码中的各种“警报”,但另一组眼睛或这方面的更多知识可能会解决我的问题,并指出我做错了什么

我所看到的是,非常偶然地,从ServiceWorker(postMessage)到达客户机(onmessage)的消息的顺序与写入它们的顺序不同。如果不是调试器,则必须是我的代码

如果查看以下输出,“如何在导入消息事件之前将启动消息事件传递给客户机

查看当start消息事件到达时,SWIcnt仍处于其初始值-1

Console.log输出(按正确顺序):-

输出DIV内容:-(顺序不正确)


还有15秒,介绍消息事件就会出现?它在做什么?同样,我有断点和警报,有时两个调试窗口都打开,但这如何解释重新排序?这似乎是服务人员生命周期的问题。你能提供吗?有可能以前的软件提供启动消息,然后新的软件接管并发送介绍。没有完整的代码很难跟踪。我只是整理了一个功能齐全的SSCCE,试图让它更容易。关键是软件代码不能帮助,只能发送介绍“GrussGott”,然后是“start”“。控制台日志同意。问题在于客户端消息事件到达开始-->简介。很抱歉,我没有捕获以前的消息,但很快会有更多消息。谢谢
SW Registered
TravelManagerPolyfill.js:177 Msg Sent to SW
travelmanager.html:162 Got SW command GrussGott
travelmanager.html:162 Got SW command start
TravelManagerPolyfill.js:177 Msg Sent to SW
travelmanager.html:162 Got SW command loiter
TravelManagerPolyfill.js:297 recalibrating
<div class="log" id="logWindow">
Messages: -<br>
<span style="color:white">1:27:40 PM Kick off!</span><br>
1:27:52 PM 1:27:40 PM SWI-1 NaN 1 start lng: 115.8107681 lat: -31.982061499999997 +/- 1697<br>
<span style="color:red">1:27:55 PM New ServiceWorker instance 0</span><br>
1:28:37 PM 1:27:40 PM SWI0 1 2 loiter lng: 115.8107681 lat: -31.982061499999997 +/- 1697<br>
</div>
var SWIcnt = -1;
var SWIhits = [];

navigator.serviceWorker.addEventListener("message", SWMessage);

function SWMessage(e)
{
var resp = e.data;
console.log("Got SW command "+resp.cmd);

if (resp.cmd == INTRO) {
    SWIhits[++SWIcnt] = 0;
    logWindow.innerHTML += "<span style='color:red'>" + 
                        new Date().toLocaleTimeString() + 
                        " New ServiceWorker instance " + 
                        SWIcnt +"</span><br />" ;
    return;
}

SWIhits[SWIcnt]++

if (resp.cmd == ERROR) {
    logWindow.innerHTML += "<span style='color:yellow'>" + 
                        new Date().toLocaleTimeString() + 
                        " error from SW  " + 
                        resp.data.message +"</span><br />" ;
    return;
}

const prolog = "";
const epilog = "<br />";
var position = resp.data;
var outMessage = prolog + new Date().toLocaleTimeString() + " " +
                new Date(position.timestamp).toLocaleTimeString() + " SWI" +
                SWIcnt + " " + SWIhits[SWIcnt] + " " + resp.serialNum + " " +
                resp.cmd + " lng: " + position.coords.longitude + " lat: " +
                position.coords.latitude + " +/- " + position.coords.accuracy +
                epilog; 
logWindow.innerHTML += outMessage;
}
var   doryRegister  = [];            // Meet someone new every day.
const INTRO         = "GrussGott";   // Tell clients we're new.


function sendClient(client, cmd, msg)
{                 
    if (!doryRegister[client.id]) {
        doryRegister[client.id] = 0;
        if (!postIt(client,{'cmd':INTRO})) return false;
    }

    return postIt(client,   
                    {
                    "cmd" : cmd,
                    "serialNum" : ++doryRegister[client.id],
                    "data" : msg
                    });
}

function postIt(client,msg)
{
    try {
        client.postMessage(msg)
    } catch (e) {
        console.log("Could not respond to client: "+e.message)
        return false;
    }
    return true;
}