JS学习-PromiseWorker
PromiseWorker
PromiseWorker是一个ChromeWorker,调用而不是postMessage()发送消息,而是调用post(),它返回一个Promise。
PromiseWorker模块由两个JavaScript文件PromiseWorker.jsm和PromiseWorker.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.
}

浙公网安备 33010602011771号