Webworkers
- это, по сути, функции, которые вызываются через onMessage
, поэтому перевод их в «спящий режим» должен быть просто вопросом отправки конкретного сообщения в течение определенного периода времени.
В отличие от потоков в таких языках, как Java, WebWorkers
не обязательно должен работать в непрерывном цикле (и потреблять процессор), чтобы сохранить полезность; они могут отправлять сообщения столько раз, сколько пожелаете.
В этом примере рабочий «спит», ожидая ввода пользователя.
index.html:
<script>
var worker = new Worker("worker.js");
worker.onmessage = function(e) {
console.log("Send and recieved " + e.data);
}
function tellWorker(element) {
var data = element.value;
worker.postMessage(data);
}
</script>
worker.js:
self.onmessage = function(e) {
self.postMessage(e.data);
}
Простите, если я неправильно понял ваш вопрос.
Edit:
Другая возможность, если предположить, что WebWorker
работает в цикле setTimeout
, прослушать сообщение, которое может вызвать clearTimeout
, пока пользователь что-то делает.
Обновление:
Этот код создаст объект, изменит его через рабочий, а затем изменит его снова после того, как родительская страница установит флаг:
index.html:
<input type="button" value="start" onclick="startWork()" /><br>
<input type="button" value="passObject" onclick="finishWork()" />
<script>
var worker = new Worker("worker.js");
var incompleteObject = {
val : 0,
done : false
};
worker.onmessage = function(e) {
console.log("Exit Status: ");
console.log(e.data);
}
function startWork() {
worker.postMessage(incompleteObject);
}
function finishWork() {
incompleteObject.done = true;
worker.postMessage(incompleteObject);
}
</script>
worker.js:
self.onmessage = function(e) {
var obj = e.data;
if(obj.done == false) {
obj.val = 2;
} else {
obj.val = 4;
}
self.postMessage(obj);
}