上一篇文章:MIS2000Lab.的「HTML5 認證考試,從零開始」#28-- Web Socket,實作即時通訊
http://ithelp.ithome.com.tw/question/10161110
JavaScript在網頁程式上是非常實用又具有威力的工具,但是JavaScript必須在瀏覽器上執行,
也就是說:必須在使用者觀賞網頁並且填寫表單、或是與之互動時才能執行它。
如果您想「定時」自動執行某一段JavaScript那就麻煩了,
除非有個使用者定時啟動瀏覽器來執行這個程式(這樣就不是自動,而是手動執行)。
HTML5提供了新的作法名為Web Workers,可以讓您不用載入就能個別處理背景的執行緒,也可以讓瀏覽器保持可反應的狀態
Web Worker可以讓您執行一個”長程的”非同步任務
並且讓瀏覽器保持可反應的狀態。每一個Web Workers都是一個獨立的執行緒並且在各自分開的環境下運作。
當一個應用程式初始化一個Web Worker而且靠著傳送訊息與它溝通,當然也可以結束他自己創建的Web Worker。
Web Workers有下面幾種工作的情境:
第一,長程執行或是緩慢的I/O運作
第二,執行長時間的運算
第三,在同時運作的執行緒之中區隔工作
下面的範例WebWorker_01.html,網頁可以使用postMessage()函式送出訊息,
靠著message事件可以從Web Worker捕捉(取得)到訊息。
它會讓worker.js(另一個JavaScript程式)在背景反覆地運算執行。
<div id="result"></div>
<script>
var worker = new Worker('worker.js');
worker.onmessage = function (event) {
document.getElementById('result').textContent = event.data;
};
</script>
//== worker.js的內容 ==========================
var n = 1;
search: while (true) {
n += 1;
for (var i = 2; i <= Math.sqrt(n) ; i += 1)
if (n % i == 0)
continue search;
postMessage(n); // found a prime!找到之後,傳遞給網頁。
}
==== Web Workers分成兩大類 ====
第一, 專屬(dedicated)Web Workers。
專屬的Web Workers與創建它的網頁有互斥(exclusive、唯一、專屬)屬性。它執行起來是跟網頁「非同步(asynchronous)」方式運作。
唯有創建Dedicated Web Worker的”這一個網頁”才能傳送訊息給Web Worker並且接收它回傳的訊息。當然,這個創建Web Worker的網頁也能結束它。
重點來了!如果創建Dedicated Web Worker的”這個網頁”被關閉、或是結束、或是使用者連結到其他網頁了,
這個網頁啟始的 “所有”Dedicated Web Worker都會停止!
Web Worker也可以強迫中斷自己!
常見的使用情況是:處理一段長期的運算任務,或是上傳一個大檔案、處理大量資料等等。
第二, 分享(shared)Web Workers。
可分享的Web Worker也是由一個網頁來創建以後,但(同一個網站、同一個網頁應用程式裡面的)”其他網頁”可以傳送、接收訊息給”同一個”共享的Web Worker。
Shared Web Workers可以被同一網站內的任何網頁控制它。
除非使用者超連結到「其他網站(外面的網站)」才會停止Shared Web Workers。
舉例來說,網頁購物網站上常見的「購物車」就能使用AJAX方法的Shared Web Workers分享購物車裡面(已採購的)產品資訊,
只要您仍在”同一個”購物網站裡面瀏覽,就能在其他網頁看到您的購物車裡面的採購物品。
下面的示範會先建立一個Shared Web worker,用來傳送、接收訊息。
function replyHandler(event) {
...
}
var sharedWebWorker;
...
sharedWebWorker = new SharedWorker("sharedProcessScript.js");
// 建立一個Shared Web Worker。
sharedWebWorker.port.addEventListener("message", replyHandler, false);
sharedWebWorker.port.start();
// 傳送訊息「之前」在這個Port使用.start()。
...
var data = ...;
sharedWebWorker.port.postMessage(data);
Shared Web Worker有一個connect事件,每一次有網頁用.start()來開啟一個新的Port就會觸發這個connect事件。
function messageHandler(event) {
// Handle messages received on a port
...
}
function connectHandler(event) {
var port = event.ports[0];
port.addEventListener("message" messageHandler, false);
port.start();
}
self.addEventListener("connect", connectHandler, false);
下一篇文章就是三十天的最後一篇了
我們將討論,如何參加認證考試?以及相關的注意事項?
MIS2000Lab.的「HTML5 認證考試,從零開始」#30-- 參加微軟認證考試(如何報名,以Prometric為例)
http://ithelp.ithome.com.tw/question/10161359
本系列文章已經集結出書
MIS2000 Lab. 周棟祥/吳進魯
PChome http://24h.pchome.com.tw/books/prod/DJAV0S-A90060ASI
博客來 http://www.books.com.tw/products/0010671214
天瓏書局 https://www.tenlong.com.tw/items/9863475750?item_id=1003110