阻塞事件循环

2024-04-26

我正在通过 Nodeschool 参加“函数式 Javascript 研讨会”。其中一项练习的标题是“阻止事件循环”,我很难理解它。通过过去的练习,我确保真正尝试理解解决方案,这样如果我必须重做问题,我就会理解如何解决它(而不是第一次就破解它)。但这个概念确实对我来说是一个挑战。

修改样板中提供的递归重复函数,例如 它不会阻塞事件循环(即定时器和 IO 处理程序可以 火)。这必然要求重复是异步的。

超时会在 100 毫秒后排队等待触发,这将打印 测试结果并退出该过程。重复应该释放 控制事件循环以允许在所有操作完成之前超时中断。

尝试在超时触发之前执行尽可能多的操作!

样板文件

function repeat(operation, num) {
  // modify this so it can be interrupted
  if (num <= 0) return
  operation()
  return repeat(operation, --num)
}

module.exports = repeat

Solution

function repeat(operation, num) {
        if (num <= 0) return

        operation()

        // release control every 10 or so
        // iterations.
        // 10 is arbitrary.
        if (num % 10 === 0) {
          setTimeout(function() {
            repeat(operation, --num)
          })
        } else {
          repeat(operation, --num)
        }
      }

module.exports = repeat

我试图更好地理解 setTimeout 并且我在某种程度上理解它是如何工作的。但我不明白问题本身的一些语言和概念:

修改样板中提供的递归重复函数,这样它就不会阻塞事件循环(即计时器和 IO 处理程序可以触发)。这必然需要重复 异步。

我不明白该解决方案使每 10 次重复都是异步的,如何防止重复阻塞事件循环。我假设事件循环和事件队列是相同的东西?例如,当 JavaScript 代码通过其代码同步运行时,点击会被放置在事件队列中,直到执行堆栈为空,然后才会查看队列。每 10 次重复异步如何防止队列被阻塞——我对“被阻塞”的理解是队列中的项目被阻塞,直到堆栈为空,此时 javascript 会查看队列中的内容。因此,假设在重复 10、20、30 等时,这段代码使这些重复异步,但它是否仍然继续遍历所有数字,直到它达到零,此时堆栈现在为空,然后 JavaScript 查看队列?那么这个解决方案如何解决像问题所问的那样的阻塞呢?

接下来,问题涉及“释放控制”。不知道这意味着什么。什么是控制?如何释放控制?释放的目的是什么?

紧接着,问题说“在所有操作完成之前允许超时中断”。中断是否意味着基本上每10次重复就被中断(直到同步代码结束才允许完成)?

最后,最后的挑战是在超时触发之前尝试执行尽可能多的操作......我也不明白这如何适用于解决方案。 setTimeout 似乎没有设定持续时间。


消息队列(您将其称为事件队列)是一个列表messages待处理

事件循环一一处理这些消息完成

您发布的重复功能的阻止版本将是

function repeat(operation, num) {
    if (num <= 0) return

    operation()

    repeat(operation, --num)
}

您可以看到,这会递归地调用自身,直到 num

将此与非阻塞版本进行对比

function repeat(operation, num) {
    if (num <= 0) return

    operation()

    // release control every 10 or so
    // iterations.
    // 10 is arbitrary.
    if (num % 10 === 0) {
        setTimeout(function() {
            repeat(operation, --num)
        })
    } else {
        repeat(operation, --num)
    }
}

每 10 次迭代,该函数不会递归调用重复,而是将(凭借 setTimeout)下一次调用重复到end的消息队列并且不执行任何其他操作(因此已完成)

这允许事件循环处理在 setTimeout 调用之前的 10 次重复迭代期间放置在消息队列中的任何和所有消息,并且只有当这些消息处理完成后才会执行 setTimeout 中的回调,这将是重复函数的下一次迭代

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

阻塞事件循环 的相关文章

  • Javascript .includes 函数无法与对象数组一起正常工作[重复]

    这个问题在这里已经有答案了 我有一个正在使用的对象数组 includes 功能 我正在使用数组中的对象搜索该数组 对象是相同的 但似乎没有匹配项 我已将问题复制到这把小提琴 https jsfiddle net 6dua0u0n 代码也在下
  • 具有多个参数的 JavaScript 函数

    我有一个将数组作为输入的函数 我如何修改它以使用变量参数和数组 例如我想要arrSum 1 2 3 arrSum 1 2 3 回来true即两者都应该返回 6 const arrSum arr gt arr reduce a b gt a
  • Soundcloud自定义播放器动态添加和播放歌曲

    我在用soundcloud自定义播放器 https github com soundcloud soundcloud custom player创建一个可以播放所有歌曲的播放器 我的网站 当我只放置任何曲目或帖子的静态网址时 这效果非常好
  • Node.js 主机名/IP 与证书的替代名称不匹配

    我正在编写一些节点代码来进行 Facebook 的服务器端登录 我已经非常接近让它完全发挥作用了 但是我在请求 auth code 时遇到了麻烦 我认为这可能与 Facebook 应用程序设置有关Site URL但我尝试过的都没有成功 我使
  • 如何使事件 DOM 侦听器适应 Google Maps JavaScript API v3.35

    我曾经使用以下代码来捕获用户的 Enter 键事件 如果用户没有选择其中任何一个 即没有标记为 pac 的 pac item 则自动从自动完成结果 pac items 中选择第一个结果 项目选择 var input document get
  • Google Analytics 是否具有针对长时间运行的网络应用程序的“心跳”功能?

    我正在制作一个专注于观看嵌入内容的网络应用程序 我希望应用程序客户端向 GA Google Analytics 发送 心跳 类型的信号以保持会话继续进行 现在看来 如果访问者观看视频 5 10 分钟 GA 就会假设他已经离开页面 并将用户的
  • JavaScript 闭包与匿名函数

    我和我的一个朋友目前正在讨论 JS 中什么是闭包 什么不是 我们只是想确保我们真正正确地理解它 我们以这个例子为例 我们有一个计数循环 想要在控制台上延迟打印计数器变量 因此我们使用setTimeout and closures捕获计数器变
  • 如何防止脚本注入攻击

    Intro 这个话题一直是 StackOverflow 以及许多其他技术论坛上许多问题和答案的祸根 然而 其中大多数都是特定于具体条件的 甚至更糟 通过脚本注入预防中的 整体 安全性dev tools console or dev tool
  • PMT功能 支付方式

    下面是我计算贷款付款的函数 就像在 Excel 中一样 我需要添加另一个参数 即付款类型 function PMT ir np pv fv ir interest rate per month np number of periods mo
  • 属性列表后缺少 jquery 验证 }

    我这里有这个代码 order validate rules name required true lastname required true address required true telephone required true di
  • 装饰器功能不起作用(意外标记)

    刚刚尝试在 React 中使用装饰器 import React from react import Fade from Transitions Fade import withVisible from withVisible withVis
  • canvas:如何在一个变换语句中完成平移、倾斜、旋转...?

    最近几天我在学习 变换 现在我知道如何通过变换的矩阵进行平移 旋转 倾斜 缩放 但如果我想在一个转换语句中执行上述所有操作 我该怎么办 ctx transform a b c d e f 当我们想要通过变换旋转某些东西时 我们必须为每个参数
  • 使用 var 与 let/const 进行块级变量重新声明

    Part 1 给出这个例子 var number 10 var number 42 console log number 42 为什么第 4 行不抛出Uncaught SyntaxError Identifier number has al
  • JavaScript:字符串连接性能低下? Array.join('')?

    我读过如果我有一个for循环 我不应该使用字符串连接 因为它很慢 例如 for i 0 i lt 10000000 i str a 相反 我应该使用Array join 因为它更快 var tmp for i 0 i lt 10000000
  • 如何在 jQuery 中检查 null 对象

    我正在使用 jQuery 我想检查页面中是否存在某个元素 我写了以下代码 但它不起作用 if btext i null alert btext i text btext i text Branch i 如何检查元素是否存在 检查jQuery
  • 在 JavaScript 中将整数数组转换为字符串数组

    我有一个如下所示的数组 var sphValues 1 2 3 4 5 然后我需要转换上面的数组 如下所示 var sphValues 1 2 3 4 5 我怎样才能转换 我用它来自动完成 您可以使用map https developer
  • 在单选按钮选择上提交 Rails 表单

    我有以下 Rails 表单 有效 但我想删除 Submit tag 并在选择单选按钮后立即提交表单 我怎么做 p nbsp nbsp p p p 所以我找到了精确的解决方案 感谢输入人员 它帮助我重新定义了我的谷歌搜索
  • JSON 和 AJAX 与 jQuery 有什么区别?

    我听说 JSON 会序列化所有数据 这可以防止我在跨浏览器支持等方面遇到客户端问题 我一直在使用 AJAX 和 jQuery 这看起来很简单 但我不确定其中的区别 我读过我也可以使用它来获取数据 ajax url url dataType
  • 将 csv 解析输出保存到变量

    我是使用 csv parse 的新手 项目 github 中的这个示例满足了我的需要 但有一个例外 我不想通过 console log 输出 而是想将数据存储在变量中 我尝试将 fs 行分配给变量然后返回data而不是记录它 但这只是返回了
  • MutationObserver 不适合儿童

    提前为可能是一个简单的问题和下面令人震惊的 javascript 道歉 我的问题如下 网站上有一个横幅 每隔几秒钟就会显示四个图像 我正在尝试将 印象 推入数据层以供 GTM 拾取 为了显示下一个图像 我们 不是我自己 将下一个横幅图像的

随机推荐

  • JMX 的使用以及如何用于现有应用程序

    几年前我们就在 JDK 5 上开发了分布式 Web 应用程序 JMX 将如何帮助这个应用程序 1 它能帮助我监控性能 内存 CPU 以及网络和磁盘 IO 吗 2 如果是这样 那么应用程序部署在多个服务器中 我如何在一个仪表板中进行监控 3
  • 为什么所有的 Active Record 都讨厌? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Ruby 中将…(省略号)更改为…(三个句点)?

    我正在解析这个文件 http msdn microsoft com en us library ms189782 aspx using nokogiri 我发现有一些 省略号 该页面中的字符且无法删除 我想知道如何用Ruby来替换所有 省略
  • JavaScript 正则表达式异常(无效组)

    我有以下正则表达式 lt index d g 我正在尝试在像这样的字符串中查找索引整数 some text index 1 id 2 value 3 该表达式在 php 中工作正常 但在 javascript 中不起作用 我收到以下错误 未
  • 以正常形式打印浮点数,而不是指数形式/科学记数法[重复]

    这个问题在这里已经有答案了 我有一个以指数形式打印的数字 gt gt gt gt gt gt a 1 1221759 gt gt gt print a 8 184920266599223e 07 gt gt gt 我怎样才能让它以正常形式打
  • 如何在express和node中从html表单发送put请求

    我有一个用于编辑对象的表单 我想使用 Express 3 x 和 node js 正确处理它 编辑物品路线 item edit显示用于编辑对象的表单 我想我有三个选择 1 放置一个值为 edit 的隐藏字段 这样我就可以在express中正
  • 使用 MVCMailer 尝试发送到非本地电子邮件地址时,邮件服务器需要身份验证

    我想向用户发送新闻通讯电子邮件 我已经这样做了 public ActionResult SendNewsLetter userMailer NewsLetter Send return View 在 userMailer 类中 public
  • 基于超简单静态文件(html)的php站点缓存

    我有一个网站 基本上只显示内容 没有任何表格和后期处理 该网站基于 PHP 并托管在共享主机上 它很少改变 我想为此网站启用缓存 它是共享托管 所以我需要一个解决方案 不使用 Memcached 不需要将我的网站移至 VPS 不要使用APC
  • 如何删除firestore自动生成的单字段索引?

    update 太长了 如果您到达这里 您应该重新检查构建数据库的方式 随着时间的推移 您的文档可能会被消耗 由于嵌套列表等 原问题 我有一个包含很多字段的文档集合 我不查询文档 甚至不查询简单的查询 我只使用 db collection m
  • Spark Streaming 中的 ML 模型更新

    我通过 Spark 批处理作业在 HDFS 中保留了机器学习模型 并且我在 Spark 流中使用它 基本上 ML 模型从 Spark Driver 广播到所有执行器 有人可以建议我如何在不停止 Spark Streaming 作业的情况下实
  • 如何将 jQuery UI 日期选择器初始化为查询字符串中的日期?

    鉴于此标记 Calendar html date 1 2 2003 div class inlinedatepicker div 这将毫不费力地显示一个内联日期选择器 太棒了 如何将日期选择器预设为通过查询字符串传入的日期 请注意 在本例中
  • Materialise CSS 侧面导航不起作用

    我已经对 Materialise 运行进行了基本设置 除了滑出侧面导航之外 一切似乎都很好 这是我的代码 菜单 ul class right hide on med and down li a class dropdown button h
  • 是否可以将 ComboBox DisplayMember 设置为列表中对象的属性?

    我有一个正在填充的 ComboBox 其中 ComboBox Items 中的每个对象都是对象列表 目前 组合框为每个项目显示 集合 是否可以让组合框显示列表中包含组合框项目的第一个对象的成员 我目前正在通过以下内容填充组合框项目 fore
  • vue组件设置child的数据值

    我正在使用 vue 轮播 https ssense github io vue carousel api https ssense github io vue carousel api 它运行良好 但我需要重置轮播 我可以看到当前页面有一个
  • 如何在node.js EJS视图中转义HTML?

    我想转义 bloglist i Text 字段中的 html 如何使用 EJS 做到这一点 h1 h1 p Welcome to p h3 h3 div div
  • R:从数据表中选择范围内的值

    我在 R 中有一个数据表 name date John 1156649280 Adam 1255701960 etc 我想获取日期在某个范围内的所有行 在 SQL 中 我可能会说SELECT FROM mytable WHERE date
  • Scala 映射 foreach

    given val m Map String Int a gt 1 b gt 2 c gt 3 m foreach key String value Int gt println gt gt gt key key value value 为
  • 将 sys.stdout 重定向到 python 日志记录

    所以现在我们有很多 python 脚本 我们正在尝试整合它们并修复和冗余 我们正在尝试做的事情之一是确保所有 sys stdout sys stderr 都进入 python 日志记录模块 现在最重要的是 我们希望打印出以下内容
  • 如何在Python中像ERB一样进行模板化? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 ERB http ruby doc org stdlib 2 3 0 libdoc erb rdoc E
  • 阻塞事件循环

    我正在通过 Nodeschool 参加 函数式 Javascript 研讨会 其中一项练习的标题是 阻止事件循环 我很难理解它 通过过去的练习 我确保真正尝试理解解决方案 这样如果我必须重做问题 我就会理解如何解决它 而不是第一次就破解它