Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';在定义对象时,我是否在(JavaScript)Worker中使用此选项?_Javascript_Html_Inheritance_Web Worker_Prototype Programming - Fatal编程技术网

为什么可以';在定义对象时,我是否在(JavaScript)Worker中使用此选项?

为什么可以';在定义对象时,我是否在(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

来自Java(OOP)世界,我习惯于类、继承和多线程。现在,对于JavaScript领域的小讨论,我尝试在适用的地方利用这些范例和模式。阅读:使用原型(“类”/“对象”)和WebWorkers进行并行执行。然而,这一案例不起作用

正在启动工作程序的HTML站点:

<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
    }
}