Web Worker 与 Promise

2024-02-05

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

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

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


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

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

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

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

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

  • use an 索引数据库 https://developer.mozilla.org/en/docs/IndexedDB它提供了一个异步API,

  • 运行您自己的内存中数据结构,并按照您的指示使用网络工作人员来执行实际查询,

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

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

  • 使用例如开发混合网络应用程序Parse https://parse.com/.

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

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

I found 这本书 http://pragprog.com/book/tbajs/async-javascript一本有用的读物​​。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web Worker 与 Promise 的相关文章

随机推荐

  • 在 Angular 中什么时候应该使用 href 代替 routerLink?

    当我在 Angular 中开发并创建视图时 我总是使用 routerLink 从一个视图导航到另一个视图 最近我看到用 Angular 制作的重要页面使用 href 而不是 routerLink 来路由网站上的视图 我的问题是 什么时候在
  • 使用 shell 脚本在 XML 中搜索字符串或数字时获取父标记

    我有一个结构与此类似的文件
  • scikit-learn 的 TfidfVectorizer 在线版本

    我正在寻找使用 scikit learn 的HashingVectorizer因为它非常适合在线学习问题 文本中的新标记保证映射到 桶 不幸的是 scikit learn 中包含的实现似乎不包括对 tf idf 功能的支持 将矢量化器输出传
  • primefaces keyup 或其他 ajax 事件延迟

    我有类似的东西
  • 在需要/加载软件包后,是否可以覆盖对软件包(重新)安装的阻止?

    实际问题 是否可以在需要 加载包后覆盖对包 重新 安装的阻止 我明白阻止 真实 重新安装 to the same一旦使用了包 从中加载包的库就非常有意义 但我的用例有点不同 背景 我喜欢用 沙箱库 来测试自己的包的想法 除了要测试的包之外
  • 将 graphql 变量传递给 Material UI 组件

    我正在使用 React Typescript 并有一个自动完成材质 UI 组件 我正在尝试将查询建议添加到自动完成组件中 我的 graphql 查询如下所示 查询定义 import gql from graphql tag import u
  • 在java中打印unicode字符

    显示中unicodejava中的字符显示 符号 例如 我尝试打印 它是unicode编号为 U 0905 html 表示为 下面的代码打印 代替unicode特点 char aa u0905 String myString aa resul
  • var 和变量的范围

    如果我有一个像这样的函数
  • 如何为除某些列之外的列名添加前缀?

    这是 ScalaBoy 提出的问题的改编here https stackoverflow com questions 53380310 how to add suffix to column names except some column
  • 如何在 Android 应用程序中使用 facebook 登录?

    如何授权facebook sdk 我在授权后如何获取用户详细信息 如姓名 性别 出生日期 年龄 你必须看看https developers facebook com docs reference api https developers f
  • System.nanoTime() 的精度与准确度

    的文档System nanoTime http docs oracle com javase 6 docs api java lang System html nanoTime 说以下 强调我的 此方法只能用于测量经过的时间 与系统或挂钟时
  • 当第二个键已按下时如何检测按键按下/按下

    在我的应用程序中 我允许用户通过按住右箭头键通过使用ProcessCmdKey 现在我想让用户能够在需要时提高滚动速度 理想情况下 用户应该能够按住右箭头键 那么当他决定提高速度时 他应该在不释放右箭头键 同时按住换档键当他决定恢复正常速度
  • 检查两个字符串是否包含相同的字符,不考虑它们的频率

    我有两个字典对应于两个不同字符串的字符数 我想检查它们是否由相同的字符组成 与字符出现的频率无关 说 我有两个字符串caars and racs它们是由相同的角色组成的a c r s 我知道cmp比较两个字典的方法 它还比较两个键值对 但我
  • InputStreamReader缓冲问题

    不幸的是 我正在从一个具有两种字符编码类型的文件中读取数据 有一个标题和一个正文 标头始终采用 ASCII 格式 并定义正文编码所用的字符集 标头不是固定长度 必须通过解析器运行以确定其内容 长度 该文件也可能非常大 因此我需要避免将整个内
  • Ubuntu 11.10 上的 OpenCV

    我刚刚将系统从 ubuntu 11 04 更新到 11 10 现在我无法再编译任何包含 OpenCV 库引用的 C 程序 我已经尝试重新安装 OpenCV 我使用2 1版本 但我遇到了这个错误 tmp ccArHTZL o In funct
  • 如何按百分比设置 svg 宽度和 svg 高度?

    我用 svg 创建了一条线 但是当我调整浏览器大小时 用 svg 创建的线没有调整大小 我尝试以百分比设置 svg 的宽度 但这样做后该线不会出现 如何按百分比设置 svg 的宽度
  • Stream.dropWhile() 没有以两个不同的值返回正确的值

    我正在尝试学习 Java 9 中的新功能 我开始了解 Stream 的 dropWhile 方法 但它在两种不同的场景中返回不同的值 这是我的代码 package src module import java util stream Col
  • 从模态窗口打开的帮助文件没有响应

    使用Delphi XE2 Win64 因此 我有一个包含许多表单的大型应用程序 如果我从主表单打开帮助文件并打开模式窗口 然后按 F1 在模式窗口上触发上下文相关帮助 帮助文件窗口将显示正确的信息 但是在关闭模式窗口之前 无法关闭帮助文件
  • Devise + Omniauth 登录 Facebook 时调用操作通道

    当我尝试使用 Omniauth 和 Devise 登录 Facebook 时 passthru被称为而不是facebook 我如何通过link to user omniauth authorize path facebook 我多次修改代码
  • Web Worker 与 Promise

    为了使 Web 应用程序具有响应能力 您可以使用异步非阻塞请求 我可以设想两种方法来实现这一目标 一种是使用 deferreds promise 另一个是网络工作者 对于 Web Workers 我们最终引入了另一个流程 并且产生了来回整理