Webworkers
là các chức năng cơ bản được gọi qua số onMessage
, do đó, để chúng 'ngủ' chỉ đơn giản là gửi một tin nhắn cụ thể đến sau một khoảng thời gian nhất định.
Không giống như các chủ đề bằng các ngôn ngữ như Java, WebWorkers
không hoạt động trong vòng lặp liên tục (và ăn CPU) để giữ lại tính hữu ích; chúng có thể được gửi đi nhiều lần tùy ý bạn.
Trong ví dụ này, nhân viên 'ngủ' khi nó đợi người dùng nhập.
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);
}
Hãy tha thứ cho tôi nếu tôi không nhận định câu hỏi của bạn.
Edit: Một khả năng khác là, giả sử các WebWorker
đang chạy trong một vòng lặp setTimeout
, lắng nghe một thông điệp rằng có thể gọi clearTimeout
trong khi một người dùng đang làm một cái gì đó.
Cập nhật:
Mã này sẽ tạo ra một đối tượng, sửa đổi nó thông qua lao động, và sau đó sửa đổi nó một lần nữa sau khi trang mẹ điều chỉnh một lá cờ:
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);
}
Nguồn
2012-02-11 19:35:07
Câu trả lời của bạn có ý nghĩa hoàn hảo, tôi hiểu công nhân. Tuy nhiên những gì tôi muốn đạt được không thể được thực hiện như thế này. Về cơ bản tôi muốn nhân viên yêu cầu một đối tượng từ cha mẹ ở giữa một khối thực hiện. Người lao động cần phải 'chờ' để đối tượng được truyền lại trước khi nó có thể tiếp tục. – Jivings
@Jivings bạn có thể chia quy trình thành hai chức năng không? Chúng tôi có thể cần phải xem một số mã mẫu, mặc dù tôi nghĩ rằng tôi biết những gì bạn muốn đạt được ngay bây giờ. Tôi sẽ cập nhật câu trả lời của mình. –
Tôi nghĩ rằng việc chia nhỏ vấn đề thành hai là những gì tôi đang hướng tới. – Jivings