JS学习-PromiseWorker

PromiseWorker

PromiseWorker是一个ChromeWorker,调用而不是postMessage()发送消息,而是调用post(),它返回一个Promise
PromiseWorker模块由两个JavaScript文件PromiseWorker.jsmPromiseWorker.js组成。
eg: https://github.com/Noitidart/PromiseWorker

PromiseWorker.jsm

PromiseWorker.jsm提供BasePromiseWorker。

Path: 'resource://gre/modules/PromiseWorker.jsm'

PromiseWorker.js

PromiseWorker.js提供AbstractWorker。

Path: 'resource://gre/modules/workers/PromiseWorker.js'

worker.js

importScripts('resource://gre/modules/workers/require.js');
let PromiseWorker = require('resource://gre/modules/workers/PromiseWorker.js');

// Instantiate AbstractWorker (see below).
let worker = new PromiseWorker.AbstractWorker()

worker.dispatch = function(method, args = []) {
	// Dispatch a call to method `method` with args `args`
	return self[method](...args);
};
worker.postMessage = function(...args) {
	// Post a message to the main thread
	self.postMessage(...args);
};
worker.close = function() {
	// Close the worker
	self.close();
};
worker.log = function(...args) {
	// Log (or discard) messages (optional)
	dump('Worker: ' + args.join(' ') + '\n');
};

// Connect it to message port.
self.addEventListener('message', msg => worker.handleMessage(msg));

main.js

const { utils: Cu } = Components;
const { BasePromiseWorker } = Cu.import('resource://gre/modules/PromiseWorker.jsm', {});

let myWorker = new BasePromiseWorker('path_to_worker_file.js');

post()

promise = myWorker.post(aFunctionName, [...args], aClosure, aTransferList);
//要传输ArrayBuffer对象,请将包含它的数组作为aTransferList参数传递。
myWorker.post('func', [buffer], null, [buffer]);
/*上面的代码也可以使用Meta对象完成。您要传输的每个特殊数据参数都可以包装在一个BasePromiseWorker.Meta对象中。*/
/* 传输单个值 */
myWorker.post('func', [new BasePromiseWorker.Meta(buffer, {transfers: [buffer]})]);
/* 传输多个值. transfers 指定要传输的值 */
new PromiseWorker.Meta({
	theBuf: aBuf,
	otherNonTrans: 'this string is not transfered but copied'}, 
	{transfers: [aBuf]
});

reject()

受支持的错误类型
* EvalError
* InternalError
* RangeError
* ReferenceError
* SyntaxError
* TypeError
* URIError

// Worker.js
// Define a custom error prototype.
function CustomError(message) {
	this.message = message;
}
CustomError.prototype.toMsg = function() {
	return {
		exn: 'CustomError',
		message: this.message,
	};
};
// A function called by message.
function func() {// Throw a custom error.
	throw new CustomError('meow');
}
// Main thread

// Define a custom error prototype.
function CustomError(message) { 
	this.message = message; 
}
CustomError.fromMsg = function(msg) {
	return new CustomError(msg.message);
};

// Register a constructor.
myWorker.ExceptionHandlers['CustomError'] = CustomError.fromMsg;

resolve()

function func(buffer) {
	// do something with buffer...
	return 1; // 1 is sent back to main thread, as a resolved promise.
}
posted @ 2022-08-12 16:10  ~LemonWater  阅读(228)  评论(0)    收藏  举报