Вложенный веб-работник в Chrome - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь раскрутить веб-работника изнутри веб-работника, используя Chrome.Исторически это было проблемное пространство с Chrome Host API, но:

Согласно ChromeStatus , по состоянию на 2018-10-22

Выделенные работникиможет создавать вложенных работников, но разделяемые работники и сервисные работники не могут.

Создание вложенного выделенного работника из общего работника пока не поддерживается.

В спецификации также есть вложенные разделяемые работники, но естьв настоящее время не планируется поддерживать их.

Повезет мне;Я использую выделенного работника.

Я не могу найти доступной информации, которая формально противоречит этому заявлению о поддержке в Chrome для настольной версии 69 (я использую Chrome 72), и мой вложенный Работник просто сидит на своем дафе иотказывается принести Дженис ее кофе.

У меня есть три движущиеся части в игре: SlaveDriver, Minion и Peon.SlaveDriver делегирует миньон.Миньон делегирует Пеону, Пеон выполняет работу, и каждый получатель берет кредит.

SlaveDriver

(
function(){
     var minion = new Worker('./Features/Work/Work.Minion.js');
     let crackTheWhip= ()=>
     {
        let message = {ID: 1};
        minion.postMessage(
           JSON.stringify(message)
        );
        console.log(message.ID);
     };
     let take_the_credit = (message)=>
     {
        let work = JSON.parse(message.data);
        console.log("Hot Coffee!");
        console.log(JSON.stringify(work));
     };
     minion.onmessage = take_the_credit;

     return {
        GetJaniceHerCoffee: crackTheWhip
     };
})();

Миньон ./Features/Work/Work.Minion.js

(
   function(){
      var self = this;
      var peon = new Worker('./Features/Work/Work.Peon.js');
      let receiveWorkOrder = (message)=>
      {
          console.log('Delegating to a Peon');
          peon.postMessage(
              message.data
          );
      };
      let take_the_credit = (message)=>
      {
          console.log('Taking the credit');
          let work = JSON.parse(message.data);
          self.postMessage(JSON.stringify(
             work
          ));

      };
      peon.onmessage = take_the_credit;
      self.onmessage = receiveWorkOrder;
   }
)();

Peon ./Features/Work/Work.Peon.js

(
   function(){
       var self = this;
       let receiveWorkOrder = (message)=>
       {
           console.log("surfing LinkedIn.");
           console.log("surfing stackoverflow");
           console.log("...wth is this? *sigh*");

           let work_result = {Value: "Coffee"};
           self.postMessage(JSON.stringify(
               work_result
           ));
       };
       self.onmessage = receiveWorkOrder;
   }
)();

Если я перестану делегироватьна миньона и пусть он выполняет всю работу peon, все идет хорошо.Но, как только я пытаюсь пригласить миньона к пеону, мне это становится не по себе.В DevTools я вижу активацию миньонов в моем списке тем, когда я отправляю сообщение в него.Мой контекст отладки переходит к рабочему потоку, и когда я отправляю сообщение peon, поток Peon добавляется в список потоков, но все распространение останавливается.Логов в консоль не бывает.Контекст отладки не переходит к потоку Peon.Ответный звонок take_the_credit моего миньона не получает ответа.

Пион просто сидит там и не выполняет свою работу.

Почему мой пион отказывается принести Дженис ее кофе?

1 Ответ

0 голосов
/ 20 мая 2019

Ответ на мой вопрос в настоящее время находится в подразделе Spawning Subworkers документации MDN по использованию веб-работников

Работники могут создавать больше работников, если они того пожелают.Так называемые подчиненные должны быть размещены в том же источнике, что и родительская страница.Кроме того, URI для подчиненных разрешаются относительно местоположения родительского работника, а не местоположения страницы-владельца.Это облегчает работникам возможность отслеживать, где находятся их зависимости.

В конечном счете, проблема, с которой я столкнулся, коренится в том факте, что, когда мой работник-миньон пытался породить своего пеона, он пыталсясделать ссылку на файл, относящийся к корню документа, а не из контекста работника, но на консоль ничего не выводилось, указывая, что файл не существует.

Чтобы связать этот простой пример:

Работорговец

<script type="application/javascript">
        var slave_driver = (
            function(){
                let minion = new Worker('/Features/Work/minion.js');
                let crackTheWhip = ()=>
                {
                    minion.postMessage(
                        JSON.stringify({SERVICE: "get"})
                    );
                };
                let take_the_credit = (message)=>
                {
                    console.log("It's about time");
                    alert(message.data);
                };
                minion.onmessage = take_the_credit;
                return {
                    GetJaniceHerCoffee: crackTheWhip
                }
            }
        )();

        slave_driver.GetJaniceHerCoffee();
    </script>

Миньон ./Features/Work/Work.Minion.js

(
   function(){
      var self = this;
      let home = location;
      let peon = new Worker('/peon.js');
      let receiveWorkOrder = (message)=>
      {
         console.log("Delegating to a Peon");
         peon.postMessage(
            message.data
         );
      }
      let take_the_credit = (message)=>
      {
         console.log("It's about time!");
         console.log("Minion Taking the Credit");
         let work = JSON.parse(message.data);
         self.postMessage(JSON.stringify(work));
      };

      peon.onmessage = take_the_credit;
      self.onmessage = receiveWorkOrder;
   }
)();

Пион ./Features/Work/Work.Peon.js

(
 function(){
     var self = this;
     let receiveWorkOrder = (message)=>
     {
       console.log("Peon surfing stackoverflow");
       console.log("Peon surfing ebay for beanie babies, cuz they're coming back, yo");
       console.log("...wth is this? *sigh*");

       let work_result = {Value: "Coffee"};
       self.postMessage(JSON.stringify(
           work_result
       ));
     };
     self.onmessage = receiveWorkOrder;
  })();

Обратите внимание на небольшое изменение ссылки на файл, сделанное, когда миньон порождает peon.Если вы перетащите сценарий «slavedriver» в тело файла index.html, а соответствующие модули - в их идентифицированные местоположения, вы должны получить предупреждение, отображающее {"Value":"Coffee"} при открытии индекса.

...