JavaScript多線程--Worker對象基礎

Worker 對象


Worker對象能夠實現JS的多線程編程,但JS中的多線程與大多數語言的多線程的結構不同,JS的多線程實際上更像網絡編程的 C/S(客戶端/服務器) 架構


Worker在構造時需要接收一個JS文件

	var worker = new Worker('JsFilePath.js');

雖然傳遞了一個JS文件,但是它不會立刻被執行,就想在其他語言裏創建好了線程對象,還需要一個方法去啓動這個線程對象
Worker對象想要啓動線程必須需要發送一條信息,Worker對象提供了postMessage()方法進行信息的傳遞

	worker.postMessage('啓動線程');
	// 其中可以傳遞任何對象(不包含BOM,DOM等)

onmessage 事件


居然發送了信息,那麼肯定就需要有接收信息的地方,Worker對象提供了onmessage事件使得Worker對象在調用postMessage()方法時能夠接收信息並作出相應的處理
構建Worker對象後,在構建對象時傳輸的文件的作用域就不再是Window對象了,而是Worker對象

	self.onmessage = function(event){};
	// 這裏的作用域不再是Window對象,而是Worker對象

postMessage()方法傳遞的信息被保存在了事件對象中的data屬性中,所以直接使用 event.data 就能夠訪問到傳遞的信息


onerror 事件


如果在Worker對象的執行過程中出現了報錯,那麼會產生onerror事件,這個事件對象中儲存着與報錯有關的信息

	self.onerror = function(event){
		event.filename		// 發生錯誤的文件名
    	event.lineon		// 錯誤代碼行號
    	event.message		// 錯誤信息
	}

終止線程


從上面的講述中可以知道,如果使用Worker就能夠有兩個作用域,一個是原生的Window對象,另一個是你在構造Worker對象是傳遞的文件中產生的Worker對象
終止線程在兩個作用域中都提供了方法,Window中可以使用Worker.terminate()方法終止線程,在Worker中可以使用close()方法終止線程(說到底兩者好像都差不多,反正都是Worker對象的方法,這個我也不做過多的研究了,接着往下看吧)


實例


	// File: mian.js
	var workerObj = new Worker('javascriptFile.js');
	workerObj.postMessage(123);

	workerObj.onmessage = function(event){
    	alert(evert.data.doubleNum);  
	};

	// File: javascriptFile.js
	self.onmessage = function(event){
    	self.postMessage({doubleNum:event.data*2}});
    	// 爲了讓 main.js 接收到處理的數據,所以再發送一條信息給 main.js
	}

	// Output: 246

如果還有不懂的可以加QQ羣 : 921998494

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章