Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.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 WebWorker未从onClick执行_Javascript_Onclick_Web Worker - Fatal编程技术网

JavaScript WebWorker未从onClick执行

JavaScript WebWorker未从onClick执行,javascript,onclick,web-worker,Javascript,Onclick,Web Worker,我指定了一名网络工作者,如下所示: var w; function startWorker() { if(typeof(Worker) !== "undefined") { if(typeof(w) == "undefined") { w = new Worker("scripts/gameengine.js"); } w.onmessage = function(event) { conso

我指定了一名网络工作者,如下所示:

var w;
function startWorker() {
    if(typeof(Worker) !== "undefined") {
        if(typeof(w) == "undefined") {
            w = new Worker("scripts/gameengine.js");
        }
        w.onmessage = function(event) {
            console.log("Testing web worker");
        };
    } else {
        console.log("No support for web workers");
    }
}


 function stopWorker() {
    w.terminate();
    w = undefined;
}
但是,;当我运行
startWorker()时从onClick函数中我得到错误:

Uncaught TypeError: undefined is not a function on line 117
第117行是
w.terminate()
;在my
stopWorker


有什么想法吗?

如果单击处理程序触发两次,
w
将在第二次调用时取消定义

出于以下原因,防御性编程是可取的:

代码应该只调用定义良好的东西;否则JS会阻止后面语句的执行

如果处理得当,console.log可以用来告诉您发生了什么

function stopWorker() {
    if ( w && (typeof(w.terminate)==='function') ){
       w.terminate();
       w = undefined;
       console.log('terminated worker per click request');
    } else {
       console.log('received click request to terminate worker, but worker undefined');
    }
}

另外,请注意,上次我检查时,工作人员无法访问浏览器功能,只能将消息传递回主脚本。这意味着没有jQuery,没有事件处理,没有试图写入屏幕上的对象,等等。只是计算和消息传递。

它不应该触发两次;但是我将尝试这样做。实现您的代码确实显示了第二个控制台日志;有什么可以避免的原因吗?我的onClick是基于在我创建的对象上悬停的结果。因此,如果检测到单击并将鼠标悬停在某个对象上,则应激活单击事件。您是否也获得了正确的行为以及第二次单击?否;我没有从startWorker()获取预期的控制台日志;它似乎从未被调用过。