如何通过Web-Workers传递自定义类实例

How to pass custom class instances through Web-Workers?

本文关键字:自定义 实例 何通过 Web-Workers      更新时间:2023-09-26

由于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会有可能吗?我对这些东西不熟悉,所以我有点迷路了。

  1. 假设你同时编写了客户端和web服务,你可以在两边都定义Animal函数
  2. 然后你可以添加到动物。prototype(在两边)toJson方法来传递你需要重新创建对象的信息(可能是选择一些属性来定义className)
  3. 你定义了一个使用反向过程的恢复器
  4. 当你发布时,你必须总是JSON.stringify(e)
  5. 在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):objinstance是实例类,将转换为对象
  • toInstanceClass(obj):instance, obj是和对象,并将返回一个实例从你的类

你需要将你的obj传递给worker,在worker中你将从你的类中构建你的实例,进行所有的操作并返回like和obj

在主线程中,您需要通过从worker返回的obj从类中重建实例,这就是全部。