javascript - Web Worker 与 Promise

标签 javascript asynchronous promise jquery-deferred web-worker

为了使网络应用程序响应,您可以使用异步非阻塞请求。我可以设想两种方法来实现这一目标。一种是使用 deferreds/promise。另一个是网络 worker 。对于 Web Workers,我们最终引入了另一个流程,并且产生了来回整理数据的开销。我一直在寻找某种性能指标来帮助理解何时选择简单的非阻塞回调而不是 Web Workers。

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

据我了解 JavaScript 处理,可以获取单个长时间运行的任务并将其分割,以便它定期产生控制,从而允许其他任务获得一部分处理时间。这是使用 Web Workers 的标志吗?

最佳答案

`Deferred/Promises 和 Web Workers 满足不同的需求:

  • Deferred/promise 是一种构造,用于分配对尚不可用的结果的引用,并组织在结果可用或返回失败时运行的代码。

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

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

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

  • 使用 IndexedDB它提供了一个异步API,

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

  • 使用服务器端脚本引擎,例如 NodeJS运行您的代码,然后使用客户端 ajax 启动查询(加上处理结果的 promise ),

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

  • 使用例如开发混合网络应用程序Parse .

哪种方法最适合您的情况?如果没有确切的要求,很难说,但以下是我会考虑的尺寸:

  • 代码复杂性 - 如果您已经拥有数据结构的代码,那么 Web Workers 可能是一个不错的选择,否则 IndexedDB 看起来更明智。
  • 性能 - 如果您需要一致的性能,服务器端实现或数据库似乎更合适
  • 架构/复杂性 - 您是否希望所有处理都在客户端完成,或者您能负担得起管理服务器端实现的精力(成本)吗?

我找到了this book一本有用的读物​​。

关于javascript - Web Worker 与 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20929508/

相关文章:

javascript - global.process 的构造函数是否存储在除 global.process.constructor 之外的任何位置?

javascript - jQuery 多选

javascript - Bluebird promisifyAll 在普通情况下不起作用

node.js - 无法读取未定义的属性 'then',bcrypt.hash()

javascript - 是否可以使用 Promise 来确保 AJAX 请求中的数据在请求完成之前不会被使用?

javascript - 当没有空间容纳时如何在新行中断开长单词

javascript - 页面从左向右滚动

javascript - 静态 Promise.resolve()/reject() 始终被解释为resolve()

c# - Ping.SendAsync() 从 0.0.0.0 返回重播,如何获取 ping 地址?

c++ - C++ 中的 std::async 和 lambda 函数不提供关联状态