JS学习-PromiseWorker
2024-10-21 09:51:23
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.
}
最新文章
- statusbarhidden stuff 状态栏的各种特性
- AngularJS 2 VS Code Linter环境设置
- Laravel5设计json api时候的一些道道
- Visual Studio工具栏中无法选择调试设备
- 启动程序的c++方法
- innerHTML使用方法
- 【转】程序员必须知道的几个Git代码托管平台
- Angular - - ngClass、ngClassEven、ngClassOdd、ngStyle
- db2_errroecode
- oracle 数据库删除表或表数据恢复问题
- 隐马尔可夫模型(HMM)攻略
- Vulkan Tutorial 07 Window surface
- java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别
- IDEA安装教程
- Markdown 插入图片技巧
- php 多维数组转二维数组
- JAVA中的栈和堆【转】
- test--3
- Office2010安装出现“错误1907”的解决方法(未验证)
- Python 内置函数math,random