TL; DR заключается в том, что когда обработчик onmessage () для веб-работника определяется как объявление функции, а не как выражение функции, он не работает. (По крайней мере, в Chrome.) И я не могу понять, почему.
У меня есть следующий простой пример настройки:
index. html
<!DOCTYPE html>
<html>
<head>
<title>Web worker test</title>
<script src="index.js"></script>
</head>
<body>
<input type="button" value="test1" onclick="run('test1.js')">
<input type="button" value="test2" onclick="run('test2.js')">
</body>
</html>
index. js
function run(filename) {
worker = new Worker(filename);
worker.postMessage("test");
}
test1. js
onmessage = function(msg) {
console.log(msg.data);
}
console.log(self.onmessage);
test2. js
function onmessage(msg) {
console.log(msg.data);
}
console.log(self.onmessage);
Вы можете попробовать это самостоятельно на http://mrbean.cryogenia.com/~davedude/webworkertest/. Если вы нажмете кнопку test1, она запишет следующее (по крайней мере Chrome 79.0.3945.117):
ƒ (msg) {
console.log(msg.data);
}
test1.js:2 test
Это показывает, что функция определена так, как ожидалось, и обработчик работает.
Напротив, когда вы нажимаете test2, все, что вы получаете, это:
ƒ onmessage(msg) {
console.log(msg.data);
}
Это показывает, что скрипт работает, и функция определена, она просто не работает как обработчик по любой причине.