2012-02-11 61 views

回答

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

原諒我,如果我誤解你的問題。

編輯: 另一種可能性是,假設WebWorkersetTimeout循環中運行,監聽,可以調用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); 

} 
+0

你的答案非常合理,我理解工人。然而,我想要達到的目標不能這樣做。基本上我希望工作人員在執行塊的中間向父節點請求一個對象。然後,工作人員需要「等待」對象才能繼續傳回。 – Jivings 2012-02-11 19:42:45

+0

@Jivings你能把這個過程分解成兩個功能嗎?我們可能需要看一些示例代碼,但我想我知道你現在想要實現什麼。我會更新我的答案。 – 2012-02-11 19:51:49

+0

我認爲把這個問題分解成兩個問題就是我正在走向的。 – Jivings 2012-02-11 19:52:22

3

setTimeoutsetInterval可用於網絡工作者。所以如果你想「等待」你的代碼,這可能是最好的解決方案。

+1

謝謝,不幸的是我不想等待指定的時間間隔,我想要一個方法在執行過程中暫停,直到它收到一條消息。 – Jivings 2012-02-11 19:56:27