在Chrome的Worker中使用`console.log`会打印两次相同的消息

16

标题的意思就是:基本上就是标题所说的。更奇怪的是,只有当您在新标签页中运行程序时才会发生这种情况,如果您仅刷新页面,则每个console.log只会输出一条消息。

这里是main.js

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

这里是worker.js

console.log('Foo bar!');

这里是index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Web Workers</title>

<style></style>
</head>
<body>

<script src="main.js"></script>
</body>
</html>
在Firefox浏览器中没有出现这种情况。我正在使用Chrome 65版本,更奇怪的是,重复的消息似乎不属于“上下文”下拉列表中列出的任何上下文,所以当我尝试过滤掉除worker.js发送的消息之外的所有控制台消息时,唯一列出的消息是第一条消息,第二条消息(重复的消息)似乎不属于任何上下文。
@bean的回答表明已经有类似于此的问题被提出(我相信是在2018年2月),但没有得到解答。如果没有人回答这个问题,我会考虑在Chrome的开发论坛/其他地方提出问题。

@TarunLalwani 我相信在 Chrome(用于 Workers)中,本地加载文件是行不通的。 - doubleOrt
@TarunLalwani 本地工作线程在Chrome浏览器中无法工作,这就是为什么我从“localhost”访问该文件的原因。如果我没有与“ServiceWorkers”混淆,那么工作线程只能在HTTPS和“localhost”中工作。 - doubleOrt
1个回答

7
这似乎是Chrome浏览器的一种奇怪行为,有人在这里发布了同样的问题Console.log double logging from web workers

然而,在worker.js中直接放置console.log并不是一个好的做法。Web Worker在单独的线程中运行,并监听从main.js发布的消息并相应地采取行动,因此任何业务逻辑都应该放在onmessage事件处理程序中。通过这样做,您就不必担心代码被执行两次。

是的,这就是我观察到的,刷新页面后可以正常工作。无论如何,如果没有“console.log”,你怎么调试? - doubleOrt
1
您可以在工作线程的JavaScript文件中设置断点,并在开发者工具中进行调试。详细信息请参见:https://developers.google.com/web/tools/chrome-devtools/javascript/ - bean
我认为放置 console.log 不会改变任何东西。似乎整个 worker 代码被执行了两次。 - T.Todua
3
不是这样,只是记录了两次日志(尝试记录 Math.random())。除非你遇到了其他问题。 - Mingwei Samuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接