2012-02-11 27 views
16

Vì công nhân web phủ nhận những bất lợi của việc thực hiện tạm dừng trong JavaScript, vì chúng sẽ không chặn giao diện người dùng, có phương pháp đáng tin cậy nào để đưa chúng đến Sleep không?Có thể khiến Công nhân Web ngủ không?

Hoặc là trong một thời gian nhất định hoặc cho đến khi họ nhận được tin nhắn?

Trả lời

4

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

} 
+0

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

+0

@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. –

+0

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

3

setTimeoutsetInterval khả dụng cho nhân viên web. Vì vậy, nếu bạn muốn 'chờ' mã của bạn thì đây có thể là giải pháp tốt nhất.

+1

Cảm ơn, rất tiếc, tôi không muốn đợi một khoảng thời gian cụ thể, tôi muốn một phương thức tạm dừng ở giữa thời gian thực thi cho đến khi nó nhận được một tin nhắn. – Jivings

Các vấn đề liên quan