let worker = new Worker('./datapoint.js'); let message = {deviceCodes:deviceCodes,dataModel:dataModel}; worker.postMessage(message);
報錯內容:
Uncaught DOMException: Failed to execute 'postMessage' on 'Worker': function(c){var W=this;if(c.kind===cf){var N=c.data;W.co(N)&&(W._73O.remove(N),delete W._map[N._id],W._75I(cf,n...<omitted>...)} could not be cloned.
問題所在:
postMessage中傳入了不可clone的參數。比如一些HTML element。因為這些元素即使傳過去了(cloned),也無法操作啊!
知識衍生
Web Worker 有以下幾個使用注意點。
(1)同源限制
分配給 Worker 線程運行的腳本文件,必須與主線程的腳本文件同源。
(2)DOM 限制
Worker 線程所在的全局對象,與主線程不一樣,無法讀取主線程所在網頁的 DOM 對象,也無法使用document、window、parent這些對象。但是,Worker 線程可以navigator對象和location對象。
(3)通信聯系
Worker 線程和主線程不在同一個上下文環境,它們不能直接通信,必須通過消息完成。
(4)腳本限制
Worker 線程不能執行alert()方法和confirm()方法,但可以使用 XMLHttpRequest 對象發出 AJAX 請求。
(5)文件限制
Worker 線程無法讀取本地文件,即不能打開本機的文件系統(file://),它所加載的腳本,必須來自網絡。