网络工作者与承诺

时间:2014-01-05 02:58:29

标签: javascript asynchronous promise jquery-deferred web-worker

为了使Web应用程序响应,您使用异步非阻塞请求。我可以设想两种方法来实现这一点。一种是使用延迟/承诺。另一个是网络工作者。对于Web工作者,我们最终会引入另一个进程,并且我们不得不来回传输数据。我正在寻找某种性能指标来帮助理解何时选择简单的非阻塞回调而不是网络工作者。

是否有某种方法可以使用哪种方法而无需对这两种方法进行原型设计?我在网上看到很多关于网络工作者的教程,但我没有看到很多成功/失败的故事。我所知道的是我想要一个响应式应用程序。我正在考虑使用Web worker作为内存数据结构的接口,该数据结构可能是0.5-15MB(本质上是数据库),用户可以查询和更新。

据我了解javascript处理,可以执行单个长时间运行的任务并对其进行切片,以便定期进行控制,从而允许其他任务处理一段时间。这会是使用网络工作者的标志吗?

1 个答案:

答案 0 :(得分:33)

延期/承诺和Webworkers满足不同的需求:

  • 延迟/保证是用于为尚未提供的结果分配引用的构造,以及组织在结果可用或返回失败时运行的代码。

  • Web工作人员异步执行实际工作(使用操作系统线程而非进程 - 因此它们的重量相对较轻)

换句话说,JavaScript是单线程的,您不能异步使用延迟/承诺运行代码 - 一旦代码运行完成承诺,就不会运行其他代码(您可以更改执行顺序,例如使用setTimeout(),但这并不会使您的Web应用程序本身更具响应性。不过,你可能会以某种方式通过例如创建异步查询的错觉。通过每隔几毫秒递增索引来迭代一个值数组(例如使用setInterval),但这几乎不可行。

为了异步执行查询等工作,从而从应用程序的UI中卸载此工作,您需要实际异步工作的内容。我看到了几个选项:

  • 使用提供异步API的IndexedDB

  • 运行您自己的内存数据结构,并按照您的指示使用Web worker来执行实际查询,

  • 使用服务器端脚本引擎(如NodeJS)运行代码,然后使用客户端ajax启动查询(以及处理结果的承诺),

    < / LI>
  • 使用可通过HTTP访问的数据库(例如Redis,CouchDB),并从客户端发出异步GET(即ajax)来查询数据库(以及处理结果的承诺),

    < / LI>
  • 使用例如开发混合网络应用程序Parse

哪种方法最适合您的情况?很难说没有确切的要求,但这是我要看的尺寸:

  • 代码复杂性 - 如果您已经拥有数据结构的代码,那么Web工作者可能是合适的,否则IndexedDB看起来更合理。
  • 性能 - 如果您需要一致的性能,服务器端实现或数据库似乎更合适
  • 架构/复杂性 - 您是否希望所有处理都在客户端完成,或者您是否可以负担管理服务器端实现的工作?

我发现this book是一本有用的读物​​。