Ответ 1
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
, когда пользователь что-то делает.
Update:
Этот код создаст объект, изменит его с помощью рабочего, а затем изменит его снова после того, как родительская страница настроит флаг:
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);
}