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密集型的业务.这篇文章中,我们整理了一批优秀的资源,你可以得到所有你 ...
随机推荐
- keil调试教程
点击跳转 如果开启调试就提示弹框错误2k,说明你没有破解你的keil,网上自行下载注册机. 调试一定要对应自己板子的晶振,否则当你测试你的延时实际时间时,keil里的sec会不一样,甚至离谱.
- [2002年NOIP普及组] 选数
已知 n 个整数 x1,x2,-,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时, ...
- Recycle Queue Sample
public class RecycleQueue<T> { public int len; T[] v; int max; int front; int rear; public Rec ...
- sql 字段分割函数 + 查询
结果: 用于解决 这种 字段的查询 1.先创建分割函数 => 复制到数据库直接执行 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /* by ...
- C#实现不用随机函数(Random)的洗牌算法
代码不多,先看效果: 类代码: 1 static class ShuffleCards 2 { 3 private static int lastHash = 0; 4 public static v ...
- 模拟ATM系统 —— 用户存款、取款、转账、修改密码和销户功能
接着上一篇: 5.用户存款功能 分析: *存款就是拿到当前账户对象 *然后让用户输入存款的金额 *调用账户对象的setMoney方法将账户余额修改成存钱后的余额 *存款后需要查询当前账户信息,确认是否 ...
- springboot启动类剔除扫描某个包
// 排除api中不引数据库导致的报错包 @ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX ...
- 003 jmeter连接数据库及jmeter关联提取器
1.jmeter连接数据库 测试计划-->线程组-->在线程组上右键-添加-配置元件-JDBC Connection Configuration-->在线程组上右键-添加-取样器-J ...
- Day25:报告编写等
今天完成的任务: 1.完成全部结论的编写,完成一部分界面测试的撰写. 2.完成moodle配置 明日计划: 1.完成前端的原型介绍 2.完善前端设计与实现报告 每日小结: 今天完成了最后一次的答辩, ...
- 【git】3.3 git分支-分支管理
资料来源 (1) https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%AE%A1%E7%90%86 ...