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.
}

最新文章

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

热门文章

  1. springboot中实现逆向工程
  2. 单元测试成神之路——Golang篇
  3. ChatGPT回答的关于maxscript + python
  4. linux下安装mysql的方式
  5. ARM的发展史以及架构解析
  6. hdu 4283You Are the One
  7. 搭建Redis高可用集群的哨兵模式(Redis-Sentinel)【Windows环境】
  8. 《Makefile常用函数》
  9. django 关联类 DoesNotExist: User matching query does not exist.
  10. Symfony2在Nginx下的配置方法图文教程