Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome中的嵌套Web Worker_Javascript_Multithreading_Google Chrome_Web Worker - Fatal编程技术网

Javascript Chrome中的嵌套Web Worker

Javascript Chrome中的嵌套Web Worker,javascript,multithreading,google-chrome,web-worker,Javascript,Multithreading,Google Chrome,Web Worker,我正在尝试从一个使用Chrome的网络工作者内部启动一个网络工作者。从历史上看,Chrome主机API一直存在问题,但: 根据,截至2018年10月22日 专用工作人员可以创建嵌套工作人员,但共享工作人员和服务工作人员不能 尚不支持从共享工作进程创建嵌套的专用工作进程 规范中也有嵌套的共享工作线程,但目前没有支持它们的计划 幸运的我;我用的是一个敬业的员工 我找不到任何与Chrome桌面版本69(我使用的是Chrome 72)的支持声明正式矛盾的信息,我的嵌套工作人员只是坐在他的行李上,拒绝给J

我正在尝试从一个使用Chrome的网络工作者内部启动一个网络工作者。从历史上看,Chrome主机API一直存在问题,但:

根据,截至2018年10月22日

专用工作人员可以创建嵌套工作人员,但共享工作人员和服务工作人员不能

尚不支持从共享工作进程创建嵌套的专用工作进程

规范中也有嵌套的共享工作线程,但目前没有支持它们的计划

幸运的我;我用的是一个敬业的员工

我找不到任何与Chrome桌面版本69(我使用的是Chrome 72)的支持声明正式矛盾的信息,我的嵌套工作人员只是坐在他的行李上,拒绝给Janice她的咖啡

我有三个活动的角色:奴隶河、仆从和牡丹。斯拉维德河代表着仆从。仆从将任务委托给牡丹,牡丹负责工作,每个接受者都获得功劳

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
     };
})();
<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>
Minion/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;
   }
)();
paun/Features/Work/Work.paun.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;
   }
)();
如果我停止委派仆从,让他做所有的工作,一切都会好起来。但是,当我试图让仆从代表给牡丹的时候,我就感到不安了。在DevTools中,当我向其发送邮件时,我可以在我的线程列表中看到仆从被激活。我的调试上下文跳转到工作线程,当我向paun发送postMessage时,paun线程被添加到Threads列表中,但所有传播似乎都停止了。控制台的日志不会发生。调试上下文不会跳转到PAN线程。我的仆从的
获取信用卡
回调没有收到响应

牡丹只是坐在那里不干活


为什么我的员工拒绝给Janice拿咖啡?

我的问题的答案目前可以在MDN文档中有关使用Web Workers的生成子Workers小节中找到

如果工人愿意,他们可能会产生更多的工人。所谓的子工作区必须与父页面位于同一原点内。此外,子工作者的URI是相对于父工作者的位置而不是所属页面的位置来解析的。这使得工作人员更容易跟踪其依赖项的位置

最终,我遇到的问题根源于这样一个事实:当我的仆从工作者试图生成其PAN时,它试图引用一个与文档根相关的文件,而不是从工作者的上下文中引用该文件,但没有输出到控制台,表明该文件不存在

要将此简单示例联系起来,请执行以下操作:

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
     };
})();
<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>
paun
/Features/Work/Work.paun.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;
   }
)();
(
 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;
  })();
请注意,当仆从繁殖牡丹时,对文件引用所做的微小更改。
如果您将“slavedriver”脚本放入index.html文件的主体中,并将相关模块放入其标识的位置,则在打开索引时,您应该会收到一个警报,显示
{“Value”:“Coffee”}

请注意,我在上面随意放置了代码。不过,我相信它会证明这个问题。为了确保它正常运行,请将PAN的
receiveWorkOrder
放在仆从的上面。为了看到它默默地失败,让仆从像我在示例中所做的那样繁殖牡丹。对于任何一个看过这个问题并可能亲身经历过这个问题的人,我能够让它顺利工作。主要的痛点是缺少关于错误的信息。我会在今天晚些时候或今晚发布一个完整的工作样本。我能说的是,这与铬的回归无关。你看到了什么@K.AlanBates嘿,很久以前。你说过你会发布一个工作样本,但我没看到…@1valdis我发布了。这是一个简单的修复方法,涉及到指定嵌套工作进程相对于生成工作进程的文件引用,而不是从文档根目录。