为什么可以';在定义对象时,我是否在(JavaScript)Worker中使用此选项?
来自Java(OOP)世界,我习惯于类、继承和多线程。现在,对于JavaScript领域的小讨论,我尝试在适用的地方利用这些范例和模式。阅读:使用原型(“类”/“对象”)和WebWorkers进行并行执行。然而,这一案例不起作用 正在启动工作程序的HTML站点:为什么可以';在定义对象时,我是否在(JavaScript)Worker中使用此选项?,javascript,html,inheritance,web-worker,prototype-programming,Javascript,Html,Inheritance,Web Worker,Prototype Programming,来自Java(OOP)世界,我习惯于类、继承和多线程。现在,对于JavaScript领域的小讨论,我尝试在适用的地方利用这些范例和模式。阅读:使用原型(“类”/“对象”)和WebWorkers进行并行执行。然而,这一案例不起作用 正在启动工作程序的HTML站点: <html> <head> <script> var worker = new Worker("worker.js"); worker.onme
<html>
<head>
<script>
var worker = new Worker("worker.js");
worker.onmessage(event) {
// here be fancy script
}
worker.postMessage("run, worker, run!");
</script>
</head>
...
</html>
工人调用的处理程序(“Handler.js”):
函数处理程序(){
}
Handler.prototype={
计算:函数(){
this.doSomething();//感谢您的评论。事实上,本文的上下文工作正常。实际代码使用了超时回调:
Handler.prototype = {
compute: function() {
self.setTimeout(this.doSomething, 1000); // Here the this got lost
},
doSomething: function() {
// Code here
}
}
似乎超时调用引用的是工作上下文。为了解决此问题,我将回调包装在一个匿名函数中(如jfriend00所建议的,将调用方作为变量引用):
再次感谢。感谢您的评论。事实上,本文的上下文工作正常。真正的代码使用了超时回调:
Handler.prototype = {
compute: function() {
self.setTimeout(this.doSomething, 1000); // Here the this got lost
},
doSomething: function() {
// Code here
}
}
似乎超时调用引用的是工作上下文。为了解决此问题,我将回调包装在一个匿名函数中(如jfriend00所建议的,将调用方作为变量引用):
再次感谢。我认为您需要,否则此
将引用任何全局范围。在我看来,它应该可以工作(尽管我对WebWorkers不太熟悉)。我们缺少任何相关的代码吗?这个函数中的应该是调用它所针对的处理程序
对象。我建议您首先确保代码在web worker外部工作,这样您就不会缺少明显的内容。然后,将它放在web worker中并在那里进行测试。当您对对象调用方法时,此
应设置为您期望的对象,因此代码中存在一些错误(我目前没有看到).尴尬!这个精心设计的示例很有效…我会随时通知您。典型的解决方案是在setTimeout捕获闭包之前分配var obj=this
,并在setTimeout函数中引用obj
,而不是this
。我认为您需要这样做,否则this
将引用任何全局范围。请参阅微软对我说,它应该能工作(尽管我对网络工作者不太熟悉)。我们缺少任何相关的代码吗?这个函数中的应该是调用它所针对的处理程序
对象。我建议您首先确保代码在web worker外部工作,这样您就不会缺少明显的内容。然后,将它放在web worker中并在那里进行测试。当您对对象调用方法时,此
应设置为您期望的对象,因此代码中存在一些错误(我目前没有看到).尴尬!这个人为的例子很有效…我会随时通知你。典型的解决方案是在setTimeout捕获闭包之前分配var obj=this
,并在setTimeout函数中引用obj
,而不是this
。
Handler.prototype = {
compute: function() {
self.setTimeout(this.doSomething, 1000); // Here the this got lost
},
doSomething: function() {
// Code here
}
}
Handler.prototype = {
compute: function() {
var caller = this;
self.setTimeout(function() { // Wrap for great justice
caller.doSomething();
} , 1000);
}, doSomething: function() {
// Code here
}
}