如何通过Web-Workers传递自定义类实例
How to pass custom class instances through Web-Workers?
由于Web-Worker JSON在线程之间序列化数据,所以这样做不起作用:
worker.js
function Animal() {}
Animal.prototype.foobar = function() {}
self.onmessage = function(e) {
self.postMessage({animal: new Animal()})
}
main.js
let worker = new Worker('worker.js')
worker.onmessage = function(e) {
console.log(e.data)
}
worker.postMessage('go!')
结果将是一个简单的对象,失去了foobar
原型方法。
是否有可能将自定义对象转移回主线程而不丢失其原型方法?比如,ArrayBuffer
会有可能吗?我对这些东西不熟悉,所以我有点迷路了。
- 假设你同时编写了客户端和web服务,你可以在两边都定义Animal函数
- 然后你可以添加到动物。prototype(在两边)toJson方法来传递你需要重新创建对象的信息(可能是选择一些属性来定义className)
- 你定义了一个使用反向过程的恢复器
- 当你发布时,你必须总是JSON.stringify(e)
-
在onmessage中你JSON.parse(m,reviver)
function Animal(name, age){ var private_name = name; this.public_age = age; this.log = function(){ console.log('Animal', private_name, this.public_age); } this.toJson = function(){ return JSON.stringify({ __type__:'Animal', // name of class __args__:[this.public_age, private_name] // same args that construct }); } } Animal.prototype.age = function(){ return this.public_age; } var a = new Animal('boby', 6); worker.postMessage(JSON.stringify(a)); function reviver(o){ if(o.__type__){ var constructor=reviver.register[o.__type__]; if(!constructor) throw Error('__type__ not recognized'); var newObject = {}; return constructor.apply(newObject, o.__args__); } return o; } reviver.register={}; // you can register any classes reviver.register['Animal'] = Animal; worker.onmessage = function(m){ var a = JSON.parse(e, reviver); }
有一种简单的方法,不需要设置原型,也不需要用JSON转换为字符串。Stringify,您需要构建函数:
-
toObject(instance):obj
、instance
是实例类,将转换为对象 -
toInstanceClass(obj):instance
,obj
是和对象,并将返回一个实例从你的类
你需要将你的obj传递给worker,在worker中你将从你的类中构建你的实例,进行所有的操作并返回like和obj
在主线程中,您需要通过从worker
返回的obj从类中重建实例,这就是全部。
相关文章:
- 如何使用javascript独立地为聚合物自定义元素的每个实例的lightdom设置样式
- 允许在自定义事件上“查找使用实例”的 IDE
- Fancybox的多个实例的自定义样式
- 使用自定义原型实例化JavaScript函数
- 触发不同实例设置的 jQuery 自定义事件
- 实例化自定义角度控制器
- 创建 JavaScript 自定义应用程序的新实例
- 如何将自定义属性添加到 HTML 环境,该属性将默认为元素的每个新实例上的空对象
- 如何使用 JavaScript 配置 DocPad 集合?“警告:自定义集合 XYZ 不是有效的集合实例”
- 如何在 javascript 中创建自定义对象的通用常量实例
- 特定对象实例的自定义函数 - 我有什么可能性
- 自定义控件中的角度贴图DrawManager实例
- 角度自定义指令基本输入过滤器工作不正常,只显示匹配的第一个实例
- jQuery自定义插件-为多个实例设置私有选项
- 在Javascript中,如何制作具有可实例化的自定义行为的数组
- 自定义jQuery方法独立作用于元素的每个实例
- 调用带有不同参数的自定义对象实例
- 将通用对象转换为自定义对象的实例
- 我如何使用JavaScript媒体元素创建一个自定义HTML5音频播放器的多个实例
- 如何创建自定义元素扩展类的新实例