17

我对网络工作者我可以在Web Workers上使用什么?

  • 难道工人可以访问存储几个问题吗?例如indexedDB/webSQL和本地存储的工作人员是从哪里启动的?

  • 如何在工作人员中包含文件?我有一个functions.js它有很多快速的应用程序相关的功能,它真的没有意义复制粘贴文件的内容在工作人员只有两个不同的地方更新我的功能。

  • 我可以在工作人员内部有DOM吗?就像加载临时音频标签中的音频文件来读取其持续时间以及是否可播放。不能访问父页面的DOM,但在工作人员本身中有DOM。

  • 如果任何问题的答案是否定的,那么应该如何手动完成?

这是一个Chrome应用程序,所以我可以访问最新的Chrome API,我不需要关心向后兼容性。

回答

9

网络工作者没有任何类型的DOM访问期限。所有DOM操作必须从主JS线程完成。 Web Workers只能通过消息传递与主线程通信。

previous SO question告诉你,网络工作者不能访问本地存储,这是很容易通过谷歌搜索找到的东西。

同一个线程有一个web工作人员可以访问的列表。

目前还不清楚“将文件包含在工作人员中”是什么意思。您可以导入脚本。我不知道你在问什么。如果这可以帮助您处理音频文件,您可以使用ajax调用来获取数据。

这对我来说听起来像你需要做一些基本的研究,你可以做什么和不可以做什么与网络工作者(因为有一个关于它在网上写的TON),然后回来了更多的具体纳入这些知识的问题。

对于网络工作者来说,没有任何黑客可以让你做比你应该做的更多的事情。

如果你有很多工作要做,并希望尽可能保持主UI的响应,你可以在主JS线程中工作,并用setTimeout在小块中完成。这是一个非常古老的设计模式,可以追溯到线程可用或易于使用之前的那些日子。它涉及到设计你的工作,使得它可以在状态存储在某个持久对象中的小块中完成,然后你可以重复执行少量工作,然后返回,只在下一个计时器中选取下一项工作。

+0

好的,但加载mp3到音频标签需要很多时间。工人们可以解决这个问题,但他们没有DOM。所以你如何建议我阅读文件的持续时间?包括什么?黑客如果不可避免..:O – Achshar

+0

我增加了更多的答案。 – jfriend00

+0

很好从包含我的意思是'我有一个functions.js有很多快速的应用程序相关的功能,它真的不会有意义的复制粘贴文件的内容在一个工人'(如[1]中所述)和是'importScripts'是我需要的,谢谢!从'hack'我的意思是像读取文件的内容并在eval中添加它们。 (是的,我知道这听起来很糟糕,但它会是一个原因),直到我阅读有关进口文件。对不起,如果我的问题感到跛脚,你可以告诉我,我是工作人员的新手..:O – Achshar

3

您可以加载一个JavaScript库。请参阅此示例:

<body> 
    <button>Start</button> 
    <div id="output"></div> 
    <script id="worker_1" type="text/js-worker"> 
     importScripts(base_url + '/worker_lib2.js'); 

     function run(event) { 
      var msg = event.data; 
      this.postMessage({ answer: hello(event.data.name)}); 
     } 

     this.addEventListener('message', run, false); 
    </script> 

    <script> 
     var base_url = window.location.href.replace(/\\/g,'/').replace(/\/[^\/]*$/, ''); 
     var array = ['var base_url = "' + base_url + '";' + $('#worker_1').html()]; 
     var blob = new Blob(array, {type: "text/javascript"}); 

     $('button').click(function() { 
      var url = window.URL.createObjectURL(blob); 
      console.log(url); 
      var worker = new Worker(url); 
      worker.addEventListener('message', function(event) { 
       $('#output').html(event.data.answer); 
      }, false); 
      worker.postMessage({ 
       name: 'Steve' 
      }); 
     }); 
    </script> 
</body> 

使用包含hello函数的库worker_lib2.js。

function hello(msg) { 
    return 'Hello... ' + msg; 
} 
相关问题