Javascript ServiceWorker client.postMessage FIFO序列
编辑:在没有调试的情况下,我似乎无法再现这一点,但我的测试并没有真正“广泛”。如果您能提供帮助,请查看以下工作示例的代码:-有一个aaa_readme.txt,它是非常直接的文档化代码。当然,关于已经讨论过的软件消息传递 我很肯定,我看到的只是Chrome调试器干预的副作用,加上我代码中的各种“警报”,但另一组眼睛或这方面的更多知识可能会解决我的问题,并指出我做错了什么 我所看到的是,非常偶然地,从ServiceWorker(postMessage)到达客户机(onmessage)的消息的顺序与写入它们的顺序不同。如果不是调试器,则必须是我的代码 如果查看以下输出,“如何在导入消息事件之前将启动消息事件传递给客户机 查看当start消息事件到达时,SWIcnt仍处于其初始值-1 Console.log输出(按正确顺序):- 输出DIV内容:-(顺序不正确)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)的消息的顺序与
还有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;
}