DVK*_*DVK 139

  • John Resig(jQuery成名)有很多在这里使用网络工作者的有趣例子 - 游戏,图形,加密.

  • 另一个用途是Web I/O - 换句话说,在后台轮询URL.这样您就不会阻止等待轮询结果的UI.

  • 另一个实际用途:在Bespin中,他们使用Web Workers来进行语法突出显示,在使用应用程序时,您希望阻止代码编辑.

  • 来自Mozilla:工作者有用的一种方法是允许代码执行处理器密集型计算而不会阻塞用户界面线程.

    作为一个实际的例子,想想一个拥有大型#s表的应用程序(这是真实世界,BTW - 取自我2年前编写的应用程序).您可以通过输入字段更改表中的一个#,并且在相当密集的过程中重新计算不同列中的一堆其他数字.

    旧的工作流程是:改变#.当JavaScript通过对其他数字的更改进行处理时,获取咖啡并且网页在3分钟内没有响应 - 在我将其优化为地狱之后.回来喝咖啡.改变第二个#.重复多次.单击"保存"按钮.

    与工作人员的新工作流程可以是:更改#.获取正在重新计算某些内容的状态消息,但您可以更改其他#s.改变更多#s.完成更改后,等到状态更改为"所有计算完成后,您现在可以查看最终的#并保存".

  • 我知道这是一个两年前的答案,但我只想提一下,你不应该需要Web Workers来获得第2项(轮询URL).XHR是异步发生的,不会阻塞; 没有必要在单独的线程上运行XHR请求.(当然,在现代应用程序中,您需要使用WebSockets而不是轮询.) (48认同)
  • 很棒的链接!我从来没有听说过工人......嗯,工人.(是时候去洗一个长长的热水......) (5认同)
  • @ josh3736 - 你是对的,但我现在很好奇是否做了许多并行的XHR异步请求会以某种方式使浏览器不满意?此外,您需要本地资源来处理工作人员可能有用的XHR响应. (5认同)
  • 打扰一下我的简单问题,但是在上面的示例中,您指的是“#”是什么? (2认同)

Kev*_*son 33

我用它们从浏览器向服务器发送大量数据.显然,您可以使用常规AJAX调用来执行此操作,但如果这会占用每个主机名之一的宝贵连接.此外,如果用户在此过程中执行页面转换(例如,单击链接),则上一页中的JavaScript对象将消失,您无法处理回调.使用Web工作程序时,此活动是在带外进行的,因此您可以更好地保证它将完成.

  • 但是您必须与网络工作者交换消息。此操作的成本何时值得收益? (2认同)

sbr*_*sbr 5

另一个用例:

如果您有大量图像和其他媒体文件以压缩格式从服务器交换,则在后台压缩/解压缩文件.

  • 这不应该在JavaScript中发生.使用旨在有效压缩图像数据的算法,*已经*压缩(PNG,JPEG)图像.在顶部抛出另一层压缩实际上可以*增加*数据的大小.对于其他类型的数据(例如,大型JSON文件),浏览器应使用标准HTTP gzipping处理压缩.**如果你在JavaScript中进行压缩,你可能会做错了*.** (37认同)
  • @ josh3736浏览器唯一能做的就是从Web服务器(或浏览器缓存)中压缩文件.它不能从本地存储器解压缩数据,也不能从websocket解压缩数据,并且根本无法压缩.Web应用程序正向上游发送越来越多的数据,对此进行压缩非常有用.一年前发布时同样有效:**如果您无法想到任何有效的JavaScript压缩用例,您可能缺乏想象力.** (12认同)
  • 我看到一些用户取消了用例的资格,但这就是我的意思.考虑像MS word这样的应用程序,就像一个强大的文档编辑器,通过它你可以在一个文件中嵌入图像,音乐文件,数据,excel表等.并且考虑到您拥有基于Web的客户端和桌面客户端以及IOS/Android客户端.对于这种用例,您可以将所有文件内容存储在zip文件中,然后在每个客户端解压缩. (11认同)
  • Instapaper小书签在将数据发送到服务器之前压缩正在保存的页面.它节省了时间和带宽. (3认同)
  • @Adria:websocket 标准正在[添加压缩支持](http://stackoverflow.com/a/19300336/201952)。如果您正在处理浏览器中生成的图像(`<canvas>`),您可以获得压缩格式(即 png)的图像数据。我的观点并不是说在 JS 中压缩“永远”是不合适的;我的观点是,*在大多数情况下*,它**不是**,并且对于大多数情况 - *特别是*处理图像,这就是这个答案所讨论的内容 - 有一个更好的替代方案来滚动你自己的压缩。 (2认同)