您可以为Web Worker分配名称吗?

时间:2017-07-03 12:37:49

标签: javascript debugging firefox web-worker

如果您启动两个使用相同JavaScript文件的Web工作者,则Firefox无法在about:debugging#workers中区分它们。你得到两个相同的条目(列在"其他工人")。

对于调试,为web worker分配名称会很方便。例如,在Java中有Thread#setName。在JavaScript的Web worker API中是否有相同的东西?

3 个答案:

答案 0 :(得分:6)

Worker() constructor采用可选的options参数,该参数可以包含name属性,例如:

let workerOne = new Worker(URL, {
  'name' : 'nameOfWorkerOne'
}),
    workerTwo = new Worker(URL, {
  'name' : 'nameOfWorkerTwo'
});
  

很好,我忽略了这一点。你知道它是否便携?

我上面链接的MDN页面上有一个link to the specification。如果您遵循白兔,您将看到options参数是规范的一部分。

它可以被读作工作者中全局对象的name属性,例如在调试器中。

答案 1 :(得分:1)

不要在api中看到任何内容,但您可以在网址上添加一个唯一的查询参数来区分每个参数。

name="random unique name"; 
new Worker('worker.js?name='+name);

查询字符串将显示在列表

enter image description here

答案 2 :(得分:0)

总之,我建议结合使用8472和Patrick Evans提供的两种方法来获得最佳的调试体验:

  1. 通过the web worker API设置名称(有关详细信息,请参阅the8472's answer
  2. 向网址添加虚拟参数,因此会显示在Firefox中(有关详细信息,请参阅Patrick Evans' answer
  3. 例如,而不是

    let worker = new Worker(url);
    

    写这样的东西

    let worker = new Worker(`${url}?name=SomeContext`, { name: 'Some useful context' });
    

    至少在Firefox 54中,可选名称参数未显示在工作者概述中。因此,扩展URL仍然很有用。另一方面,当你查看the documentation时,使用API​​(即使Firefox目前没有使用它)似乎是个好主意:

      

    name:DOMString,指定DedicatedWorkerGlobalScope的标识名称,表示worker的范围,主要用于调试目的。

    我希望浏览器在工作者概述中显示该名称(例如,Firefox中的about:debugging#workers),这会使URL扩展解决方案过时。

    请注意,通过修改URL,浏览器可能最终会执行额外的工作,甚至可能通过网络获取额外的数据。根据您的使用情况,如果您打算在生产中使用变通方法,这可能是一个缺点。在我的特定情况下,概述不是问题,因为代码是静态服务的(它是浏览器扩展的一部分)。