2013-02-09 85 views
4

请记住,我以前从未使用过网络工作者,并且在绕过他们时遇到了一些麻烦。网络工作者的限制

下面是我在做什么的简化版本的解释。

我的页面有链接到的各种文件 - 有些是文字,有些是图像等每个文件显示通用文件图标的图像。

我希望脚本与该文件的内容的预览替换每个通用图标。

脚本会向服务器请求文件(从而将其添加到缓存中,就像预加载器一样),然后创建一个画布并在其上绘制预览(图像的缩略图,文本文件的摘录,媒体文件的更具体的图标...),最后用画布使用数据URL替换通用图标的源代码。

我可以很容易地做到这一点。不过,我宁愿将它放在后台,以免在用户界面运行时干扰用户界面。

之前我吧;这一点,我需要知道:能工人用帆布工作,如果是的话我将如何创建?我不认为document.createElement('canvas')会工作,因为工人不能访问DOM,或者我误解了所有我发现的引用说他们“无法访问DOM”?

回答

6

您无法从网络工作者访问DOM。您无法加载图像。您不能创建画布元素并从Web工作人员中绘制它们。就目前而言,网络工作者几乎局限于进行ajax调用并执行计算密集型的事情。查看网络工作者和帆布对象此相关的问题/回答:Web Workers and Canvas与本文有关使用webworkers加快图像处理:http://blogs.msdn.com/b/eternalcoding/archive/2012/09/20/using-web-workers-to-improve-performance-of-image-manipulation.aspx

你的最简单的办法是大块的工作成小块(不含网络工作者),并做了大块一次,做一个setTimeout(),然后处理下一块工作。这将允许用户界面在您完成工作的同时进行响应。如果有任何CPU消耗的计算要完成(如进行图像分析),则可以将这个计算结果传递给Web工作人员,并且可以通过消息将结果发送回主线程以放入DOM中,但如果没有,那么只需在更小的块中完成工作就可以保持UI的活跃。

零件像加载图像的任务,取出由服务器等数据......,还可以异步,所以如果处理得当,它不会与UI的响应能力反正做。

下面是分块的总体思路:

function doMyWork() { 
    // state variables 
    // initialize state 
    var x, y, z; 

    function doChunk() { 
     // do a chunk of work 
     // updating state variables to represent how much you've done or what remains 

     if (more work to do) { 
      // schedule the next chunk 
      setTimeout(doChunk, 1); 
     } 

    } 
    // start the whole process 
    doChunk(); 
} 
+0

你的意思是你无法加载图像?就像下载它们或将它们显示为“img”一样? – ozanmuyes 2014-01-13 00:01:22

+0

@dihejaso - 网络工作者限制他们可以做什么,不可以做什么。他们不能创建DOM元素。 – jfriend00 2014-01-13 00:05:55

+0

好了,现在清楚了;我们可以通过XHR下载任何东西,但DOM受到限制。由于'postMessage()'函数存在,DOM更新可以通过封装源文件来实现。 – ozanmuyes 2014-01-13 05:47:01

0

网络工作者的另一个(令人沮丧的)限制是它不能在Chrome中使用地理定位。 只是我的两分钱。