Рассмотрим следующий код веб-работника из: https://www.html5rocks.com/en/tutorials/workers/basics/
Веб-страница:
<button onclick="sayHI()">Say HI</button>
<button onclick="unknownCmd()">Send unknown command</button>
<button onclick="stop()">Stop worker</button>
<output id="result"></output>
<script>
function sayHI() {
worker.postMessage({'cmd': 'start', 'msg': 'Hi'});
}
function stop() {
// worker.terminate() from this script would also stop the worker.
worker.postMessage({'cmd': 'stop', 'msg': 'Bye'});
}
function unknownCmd() {
worker.postMessage({'cmd': 'foobard', 'msg': '???'});
}
var worker = new Worker('doWork2.js');
worker.addEventListener('message', function(e) {
document.getElementById('result').textContent = e.data;
}, false);
</script>
Затем в doWork2.js:
self.addEventListener('message', function(e) {
var data = e.data;
switch (data.cmd) {
case 'start':
self.postMessage('WORKER STARTED: ' + data.msg);
break;
case 'stop':
self.postMessage('WORKER STOPPED: ' + data.msg +
'. (buttons will no longer work)');
self.close(); // Terminates the worker.
break;
default:
self.postMessage('Unknown command: ' + data.msg);
};
}, false);
Итак, когда вы нажимаетеSayHi, обработчик события «message», определенный в doWork2, сначала выбирает событие.Затем запускается еще одно событие «message», которое обрабатывается обработчиком, определенным на главной странице, которая печатает сообщение.
Последовательность шагов такова.
- Пользовательнажимает кнопку, вызывает событие сообщения.
- Обработчик в doWork2 выполняется.
- Обработчик в doWork2 вызывает событие сообщения
- Обработчик на веб-странице выполняется
Пожалуйста, ответьте на следующие 2 вопроса:
Вопрос 1: На шаге 2. выше, почему запускается обработчик в doWork2, а не обработчик на странице?
Вопрос 2: На шаге 4 после запуска события из doWork2 почему обработчик на странице выполняется, а в doWork2 рекурсивно не выполняется?