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.
}
JS学习-PromiseWorker的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- js学习之变量、作用域和内存问题
js学习之变量.作用域和内存问题 标签(空格分隔): javascript 变量 1.基本类型和引用类型: 基本类型值:Undefined, Null, Boolean, Number, String ...
- 【Knockout.js 学习体验之旅】(3)模板绑定
本文是[Knockout.js 学习体验之旅]系列文章的第3篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...
- 【Knockout.js 学习体验之旅】(2)花式捆绑
本文是[Knockout.js 学习体验之旅]系列文章的第2篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- js学习篇1--数组
javascript的数组可以包含各种类型的数据. 1. 数组的长度 ,直接用 length 属性; var arr=[1,2,3]; arr.length; js中,直接给数组的length赋值是会 ...
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- NODE.JS学习的常见误区及四大名著
NODE.JS学习的常见误区及四大名著 前段时间由于不满于社区里很多人对于NODE.JS的种种误解而写了一篇文章名为: NODE.JS之我见:http://www.cnblogs.com/pugang ...
- Node.js学习系列总索引
Node.js学习系列也积累了一些了,建个总索引方便相互交流学习,后面会持续更新^_^! 尽量写些和实战相关的,不讲太多大道理... Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- ...
- 【入门必备】最佳的 Node.js 学习教程和资料书籍
Web 开发人员对 Node.js 的关注日益增多,更多的公司和开发者开始尝试使用 Node.js 来实现一些对实时性要求高,I/O密集型的业务.这篇文章中,我们整理了一批优秀的资源,你可以得到所有你 ...
随机推荐
- idea-lombok使用
一.添加 lombok 插件 file -- setting -- plugins - 输入 Lombok 搜索,进行安装 二.引入依赖 <dependency> <groupId ...
- 通过parameters用python造数据
1.先通过命令安装allpairs库.allpairspy,命令为:pip install allpairs.pip install parameters,安装成功 2.通过python去写出来,如图 ...
- linux 源码安装 xrdp
前言xrdp可以做两件事,第一件事就是可以使得linux支持RDP协议,使得linux桌面能够通过mstsc连接,第二件事就是RDP代理,我们能通过xrdp连接到其他人的RDP资源 前者,需要编译xr ...
- win系统airtest+pytest-xdist服务器分布式运行。
1.准备至少两台服务器,集群全部是局域网,(启动脚本的时候可以使用外网ip). 2.输出的报告地址,需要把文件夹设置成共享文件夹,(连接的时候使用内外ip). 启动脚本文件 import os, da ...
- Java笔记_成员方法传参机制
成员方法传参机制(非常重要) Parameter(参数).Method(方法).Exercise(练习) 基本数据类型的传参机制 看一下案例,将main中的值传递给类中对象 /** * @ClassN ...
- Java语言中的复合运算符会自动进行类型转换
计算1/1-1/2+1/3+--+1/99-1/100 public class LoopControlExercise08{ public static void main(String[] arg ...
- pyspark 结构化数据开发实例
什么是SPARK? 1. 先进的大数据分布式编程和计算框架 2. 替换Hadoop 中的MR计算引擎. 3. 内存分布式计算:运行数度快 4. 可以使用不同的语言编程(java,scala,r 和py ...
- uni-app学习笔记之----目录认识
新建了一个项目之后,先简单认识目录结构 1.pages 存放项目的所有页面 2.static 存放静态资源 3.unpackage 存放项目打包之后生成的文件 4.App.vue 项目的根组 ...
- Python学习笔记(五)if分支语句
一.if语法 示例: 1 money = int(input('请输入余额:')) 2 if money >= 5: 3 print('买得起!') 4 5 if True: 6 print(' ...
- redis注册成windows服务步骤
1.cmd命令切换到redis的安装目录 2.执行如下命令,将redis注册成为windows的服务 redis-server --service-install redis.windows.conf ...