是否有可能导致网络工作者睡觉?

Jiv*_*ngs 18 javascript sleep web-worker

由于Web工作者否定了JavaScript中暂停执行的缺点,因为它们不会阻止UI,是否有可靠的方法来实现它们Sleep

是指定时间,还是收到消息?

Seb*_*tto 5

setTimeout并且setInterval可供网络工作者使用。因此,如果您想“等待”您的代码,这可能是最好的解决方案。

  • 谢谢,不幸的是我不想等待指定的时间间隔,我想要一个方法在执行过程中暂停,直到它收到消息。 (2认同)

Jef*_*ney 4

Webworkers本质上是通过 via 调用的函数onMessage,因此让它们“睡眠”只需在一段时间后向 at 发送特定消息即可。

与 Java 等语言中的线程不同,WebWorkers它不需要在连续(并且占用 CPU)循环中运行以保持有用性;您可以多次向他们发送消息。

在此示例中,工作线程在等待用户输入时“休眠”。

索引.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>
Run Code Online (Sandbox Code Playgroud)

工人.js:

self.onmessage = function(e) {
    self.postMessage(e.data);
}
Run Code Online (Sandbox Code Playgroud)

如果我误读了你的问题,请原谅我。

编辑: 另一种可能性是,假设正在循环WebWorker中运行,监听用户正在做某事时setTimeout可能调用的消息。clearTimeout


更新:

这段代码将创建一个对象,通过worker修改它,然后在父页面调整一个标志后再次修改它:

索引.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>
Run Code Online (Sandbox Code Playgroud)

工人.js:

self.onmessage = function(e) {

    var obj = e.data;

    if(obj.done == false) {
        obj.val = 2;
    } else {
        obj.val = 4;
    }

    self.postMessage(obj);

}
Run Code Online (Sandbox Code Playgroud)