Javascript Chrome中的嵌套Web Worker
我正在尝试从一个使用Chrome的网络工作者内部启动一个网络工作者。从历史上看,Chrome主机API一直存在问题,但: 根据,截至2018年10月22日 专用工作人员可以创建嵌套工作人员,但共享工作人员和服务工作人员不能 尚不支持从共享工作进程创建嵌套的专用工作进程 规范中也有嵌套的共享工作线程,但目前没有支持它们的计划 幸运的我;我用的是一个敬业的员工 我找不到任何与Chrome桌面版本69(我使用的是Chrome 72)的支持声明正式矛盾的信息,我的嵌套工作人员只是坐在他的行李上,拒绝给Janice她的咖啡 我有三个活动的角色:奴隶河、仆从和牡丹。斯拉维德河代表着仆从。仆从将任务委托给牡丹,牡丹负责工作,每个接受者都获得功劳 SlaveDriverJavascript 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
(
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我发布了。这是一个简单的修复方法,涉及到指定嵌套工作进程相对于生成工作进程的文件引用,而不是从文档根目录。