我在我的应用程序中使用web worker。在某些时候,我想停止我的网络工作者并重新启动它。停止web工作正常,然后我发布一些消息给web worker,它没有响应,除非我重新加载页面。所以我想知道如何在不重新加载页面的情况下重新启动web worker后重新启动它。
Main.js
var ww = new Worker("worker.js");
function mainFunction(){
//some code to form data
f1(data,function(res){
return res;
};
function f1(data,callback){
ww.postMessage({'action':'action1'});
ww.onmessage = function(event){
var response = event.data;
callback(response);
}
function f2(){
ww.postMessage({'action':'stopWW'});
ww.postMessage({'action':'reStartWW'});
ww.onmessage = function(event){
mainFunction();
}
}
在worker.js
中self.addEventListener('message',function(e){
var functionName=e.data.action;
switch(functionName){
case 'stopWW':
self.close();
break;
case 'reStartWW':
var test = {'key':1}
self.postMessage(test);
break;
case 'action1':
//do something
self.postMessage(somedata);
break;
}
});
答案 0 :(得分:2)
我建议你在一个函数中创建一个webworker,你可以多次调用它。
var ww;
function setWebWorker() {
if(typeof(Worker) !== "undefined") {
if(typeof(ww) == "undefined") {
ww = new Worker("worker.js");
}
}
}
setWebWorker();
答案 1 :(得分:2)
调用close()
或terminate()
后,您的工作人员将被有效关闭且无法访问。您可以通过再次调用ww = new Worker("worker.js");
来创建新工作人员,但第一个工作人员的内部状态将不再可用。
现在,如果你想要的是基本上暂停工作者,但保持它准备好重新启动其内部状态,我建议只需切换监听器。像这样:
function whenActive(event){
var functionName=e.data.action;
switch(functionName){
case 'stopWW':
self.removeEventListener("message", whenActive);
self.addEventListener("message", whenNotActive);
//do other stopping actions
break;
[...]//your other cases, but not "restartWW"
}
}
function whenNotActive(event){
var functionName=e.data.action;
if(functionName === 'reStartWW'){
self.addEventListener("message", whenActive);
self.removeEventListener("message", whenNotActive);
[...]//do other re-startup actions
}
}
//start the cycle
self.addEventListener("message", whenActive);
答案 2 :(得分:0)
你如何重启你的工人?
您的网络工作者声明只能在页面加载时查看您的代码一次。
请参阅:https://www.w3schools.com/html/html5_webworkers.asp了解某种颜色。
var w;
function startWorker() {
if(typeof(Worker) !== "undefined") {
if(typeof(w) == "undefined") {
w = new Worker("demo_workers.js");
}
w.onmessage = function(event) {
document.getElementById("result").innerHTML = event.data;
};
} else {
document.getElementById("result").innerHTML = "Sorry! No Web Worker support.";
}
}
function stopWorker() {
w.terminate();
w = undefined;
}