原型不在web worker中工作

时间:2014-02-19 23:32:09

标签: javascript html5 web-worker

简单地说,我正在尝试在web worker中对函数进行原型设计,并且chrome正在抛出此错误:

Uncaught TypeError: Object #<DedicatedWorkerContext> has no method 'compute'

我想要一些示例代码。这是我工作日的结束,所以我很快就把它扔到了一起。整个下午都让我难以置信。我希望明天早上我回来的其中一个问题是“啊哈哈”但是我不会有机会,我想我也会在这里问。

page.js

function threaded() { 
   var thread = new Worker('worker.js');
   thread.postMessage({a: 1 b: 2});
   thread.onMessage = function (e) { 
     console.log(e.data)
   });
}
threaded();

worker.js

var foo = function(a,b) { 
   this.a = a
   this.b = b
   this.result = false;
   this.compute();
};

foo.prototype.compute = function() { 
   this.result = this.a * this.b;
};

onmessage = function(e) { 
   var msg = foo(e.data.a,e.data.b)
   postMessage(msg)
};

我还尝试过不同的方法来调整worker.js,以便在onmessage中包含foo(),如下所示,但收到以下错误:

Uncaught TypeError: Cannot set property 'a' of undefined

工人take2.js

onmessage = function(e) { 

   var foo = function(a,b) { 
      this.a = a
      this.b = b
      this.result = false;
      this.compute();
    };

   foo.prototype.compute = function() { 
     this.result = this.a * this.b;
   };

   var msg = foo(e.data.a,e.data.b)
   postMessage(msg)
};

1 个答案:

答案 0 :(得分:4)

问题是您正在执行foo,而不是声明new实例。因此,this上下文中的foo计算为专用工作者上下文,而不是对象实例上下文。

试试这个:

var foo = function(a,b) { 
   this.a = a
   this.b = b
};

foo.prototype.compute = function() { 
   return this.a * this.b;
};

onmessage = function(e) { 
   var msg = new foo(e.data.a,e.data.b).compute();
   postMessage(msg)
};

需要注意一些重要的变化。首先,我更改了compute以返回结果,而不是将其设置为属性。请记住,使用prototype时,您将显式创建跨对象实例共享的方法,从而暗示您以面向对象的方式使用该代码。

其次,我更改了foo的构造函数,以便它不会立即调用compute。相反,在声明对象实例后调用compute

尝试一下!