Можно ли заставить Web Workers спать? - PullRequest
18 голосов
/ 11 февраля 2012

Поскольку веб-работники отрицают недостатки приостановленного выполнения в JavaScript, поскольку они не будут блокировать пользовательский интерфейс, существует ли надежный способ получить их Sleep?

Или в назначенное время, или пока не получат сообщение?

Ответы [ 2 ]

4 голосов
/ 11 февраля 2012

setTimeout и setInterval доступны для веб-работников. Поэтому, если вы хотите «подождать» свой код, это может быть лучшим решением.

4 голосов
/ 11 февраля 2012

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);

}
...