簡體   English   中英

停止后如何重新啟動Web Worker

[英]how to restart web worker after stop

我在應用程序中使用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;
      }
  });

我建議您在一個函數中創建一個Webworker,通過它您可以多次調用它。

var ww;
function setWebWorker() {
    if(typeof(Worker) !== "undefined") {
        if(typeof(ww) == "undefined") {
              ww = new Worker("worker.js");
       }
    }
}
setWebWorker();

就像本頁所建議的一樣。

一旦調用close()terminate() ,您的工作程序將被有效關閉,並且無法訪問。 您可以通過調用ww = new Worker("worker.js");創建一個新的worker 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);

您如何重新啟動工作人員?

通過查看代碼,僅在頁面加載時對Web worker進行一次聲明。

請訪問: 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM