网络工作者与承诺

Mar*_*rio 20 javascript asynchronous web-worker promise jquery-deferred

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

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

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

mir*_*ixx 39

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

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

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

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

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

  • 使用提供异步API 的IndexedDB,

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

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

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

  • 使用例如Parse开发混合Web应用程序

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

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

我发现这本书很有用.