как перезапустить веб-работника после остановки - PullRequest
0 голосов
/ 15 мая 2018

Я использую веб-работника в своем приложении.В определенный момент я хочу остановить моего веб-работника и перезапустить его.Остановка веб-работника работает нормально, затем я отправляю сообщение веб-работнику, которое не отвечает, пока я не перезагружаю страницу.Поэтому я хочу знать, как перезапустить веб-работника после его остановки без перезагрузки страницы.

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

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Как перезапустить своего работника?

Ваше заявление веб-работника выполняется только один раз при загрузке страницы после просмотра вашего кода.

Пожалуйста, см .: 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;
}
0 голосов
/ 15 мая 2018

После вызова 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);
0 голосов
/ 15 мая 2018

Я бы предложил вам создать веб-работника в функции, с помощью которого вы можете вызывать его несколько раз.

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

, как предлагает эта страница.

...