是否可以终止正在运行的Web工作者?

Ghe*_*man 4 javascript web-worker

我有一个Web工作者使用ajax-requests运行耗时的例程任务.我可以从主线程中终止它们而不是等待它们完成吗?

这就是我产生和终止它的方式:

$("button.parse-categories").click(function() {
    if (parseCategoriesActive==false) {
        parseCategoriesActive = true;
        parseCategoriesWorker = new Worker("parseCategories.js");


        $("button.parse-categories-cancel").click(function() {
            parseCategoriesWorker.terminate();
            parseCategoriesActive = false;
        });             
    }
});
Run Code Online (Sandbox Code Playgroud)

这是工人代码:

function myAjax(url, async, callback) {
    xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
            callback(xmlhttp.responseText);
        if (xmlhttp.readyState==4 && xmlhttp.status!=200) {
            self.postMessage("error");
            throw "error in ajax: "+xmlhttp.status;
        }
    }
    xmlhttp.open("GET", url, async);
    xmlhttp.send();
}

var parseCategoriesActive = true;
var counter = 0;
do {
    myAjax('parser.php', false, function(resp) {
        if (resp=='success')
            parseCategoriesActive = false;
        else {
            counter += Number(resp);
            self.postMessage(counter);
        }       
    });
} while (parseCategoriesActive==true);
Run Code Online (Sandbox Code Playgroud)

Sir*_*rko 8

你可以使用杀死任何webworker terminate().

引用MDN:

Worker.terminate()方法立即终止Worker.这并不能为工人提供完成业务的机会; 它只是立即停止.

  • “你被 `terminate()`ed” - [谢谢阿诺德](http://www.youtube.com/watch?v=iy_BBBGBpqA) (4认同)
  • 这就是我试图做的。但是工人完全忽略了这个方法。我确定它会运行但什么也不做,因为在“terminate()”之后的其他命令都可以正常执行。这就是为什么我认为可能是因为工作人员没有停止或因为它正在等待 ajax 请求完成。有趣的是,如果工人没有像僵尸一样完成,那么在关闭 Firefox 后,Firefox 进程会保持不变。在您手动终止进程之前,它无法再次运行。(我在 Ubuntu 上) (2认同)