由于Web工作者否定了JavaScript中暂停执行的缺点,因为它们不会阻止UI,是否有可靠的方法将它们转移到Sleep
?
是指定时间,还是收到消息?
答案 0 :(得分:4)
Webworkers
本质上是通过onMessage
调用的函数,因此让它们“睡眠”应该只是在一段时间后发送特定消息的问题。
与Java等语言中的线程不同,WebWorkers
不需要在连续(和CPU吃)循环中操作以保持有用性;他们可以随心所欲地发送消息。
在此示例中,工作人员在等待用户输入时“休眠”。
的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);
}
如果我误解你的问题,请原谅我。
修改强>
另一种可能性是,假设WebWorker
正在setTimeout
循环中运行,请在用户正在执行操作时侦听可以调用clearTimeout
的消息。
<强>更新强>
此代码将创建一个对象,通过worker修改它,然后在父页调整标志后再次修改它:
的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);
}
答案 1 :(得分:4)
setTimeout
和setInterval
。因此,如果您想“等待”您的代码,这可能是最佳解决方案。