如何让 JavaScript 随着时间的推移(而不是立即)写入结果?

2024-01-09

我有一个程序,它会写入很多 if 结果。例如,这个:

const a = prompt();
for(let i = 1; i < a; i ++) {
  console.log(i);
}

(不是实际的代码)
因此,当您输入一个大数字时,会有大量答案等待输入控制台。因此,当达到某个点时,内置浏览器编译器(Opera GX)就会停止工作。我需要某种方法在计算后立即写出这些数字,希望不会浪费时间。我怎样才能做到这一点? (只是为了让你知道,我的实际代码将结果放在“div”元素中)


JavaScript 是单线程的。这意味着当循环运行时,无法处理事件并且页面不会响应。您可以使用“递归”setTimeout。这会将一个长时间运行的代码分解为由事件循环管理的许多小片段。

const a = prompt();
const container = document.getElementById('container');
const f = (() => {
  let i = 0;
  return () => {
    for (let j = 0; j < 1e9; ++j) {} // simulates long calculation 
    ++i;
    console.log(i);
    container.innerText += ' ' + i;
    if (i < a) setTimeout(f, 0);
  };
})();
setTimeout(f, 0);
<div id="container"></div>

这不是真正的递归调用,也不会创建大型调用堆栈。setTimeout(f, 0)将事件推入事件循环,该事件几乎立即被删除和处理。

我只是使用闭包来避免全局计数器i。一个更简单但不太干净的版本是

const a = prompt();
const container = document.getElementById('container');
let i = 0;
function f() {
  for (let j = 0; j < 1e9; ++j) {} // simulates long calculation 
  ++i;
  console.log(i);
  container.innerText += ' ' + i;
  if (i < a) setTimeout(f, 0);
};
setTimeout(f, 0);
<div id="container"></div>

请记住,页面在循环期间仍然没有响应(长时间计算),但现在您有许多较短的循环,而不是一个长时间运行的循环,并且事件在两个循环之间处理。

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

如何让 JavaScript 随着时间的推移(而不是立即)写入结果? 的相关文章

随机推荐

  • SessionFactory.getCurrentSession() 线程安全吗?

    通过获取 Hibernate 会话是否线程安全SessionFactory getCurrentSession 假设我有一个static SessionFactory用于我的整个应用程序的对象 并且我向我的 servlet 发出了 5 个并
  • TensorFlow 专家的混合体

    我想在 TensowFlow 上实现一个通用模块 它接收 TensorFlow 模型列表 此处表示为专家 并从中构建专家混合 如下图所示http www aclweb org anthology C16 1133 http www aclw
  • OpenIdConnect 错误 - 租户标识符可能不是空 GUID

    我正在尝试使用 OWIN Open ID Connect 中间件将 ASP NET 应用程序的身份验证外包给 Azure Active Directory 应用程序在访问需要授权的页面时成功重定向到 Azure AD 登录页面 但是 在登录
  • Windows下appcontainer进程和普通进程之间有ipc的方式吗?

    我正在尝试在 Windows 中的 appcontainer 进程和普通进程之间建立 ipc 我在Windows appcontainer中做了一个进程 感谢这个article https www malwaretech com 2015
  • MVVM:如何在控件上进行函数调用?

    在 XAML 中 我有一个带有 x Name of 的文本框MyTextBox
  • 当用户使用 jQuery 将表头滚动到视图之外时,表头保持固定在顶部

    我正在尝试设计一个 HTML 表格 其中当且仅当用户将其滚动到视图之外时 标题才会保留在页面顶部 例如 表格可能距离页面向下 500 像素 我该如何制作 以便如果用户将标题滚动到视图之外 浏览器以某种方式检测到它不再位于 Windows 视
  • c# 通过单击按钮停止线程

    如何通过单击按钮结束我的线程 我通过单击按钮开始我的线程 new Thread SampleFunction Start 和我的线程 void SampleFunction int i 0 while true string Seconds
  • Ruby 调试器在 STDIN 上失败。获取用户输入

    我相信您可以轻松重现该问题 只需使用新的 RubyMine 7 1 Mac 或 Windows 版本 Ruby 2 2 创建简单的脚本 puts Hi i m gonna break your debugger user input get
  • Android onKey 带虚拟键盘

    我使用 onKey 方法捕获键盘事件 按下 public boolean onKey View arg0 int arg1 KeyEvent arg2 do something return false 这对于物理键盘按下来说效果很好 但对
  • 从 Liquid 数组中获取下一个和上一个元素

    简洁版本 我想将 1 添加到液体模板中的数字并将结果用作数组索引 capture plus one 0 plus 1 endcapture div Value of plus one plus one div div This works
  • PropTypes 在 React 中不起作用

    我正在运行 React 16 2 0 并且正在使用 PropTypes 15 6 1 我正在使用 ES6 语法和 Webpack 我试图让 PropTypes 在传递无效道具时发出警告 但它不起作用 这是代码 SimpleMessage j
  • 在 R Shiny 中读取文件

    因此 我正在 R闪亮中构建一个应用程序 要求用户上传 csv 文件 一旦被 R闪亮读入 我不确定如何实际操作该对象来使用 一般代码语法如下 用户界面文件 ui R Define UI for random distribution appl
  • 如何在 64 位 Windows 7 计算机上安装 pycrypto?

    我尝试使用安装 PyCryptopip 但它抱怨需要 vcvarsall bat 我安装了 Visual Studio 2008 但现在我得到了ValueError u path 当我尝试从安装它时pip 我尝试从下载预构建的二进制文件虚空
  • 当我从应用程序中清除数据时,Sqlite 数据库被删除

    我创造了Sqlite应用程序中的数据库 当我清除数据时settings gt applications gt manage applications the Sqlite数据库已删除 任何要保留的建议sqlite数据库原样 当您按下Clea
  • 为什么 IE11 错误地处理 Node.normalize() 的减号?

    我遇到了一个问题 即当使用 Node normalize 函数连接相邻文本节点时 具有某些字符的 DOM 文本节点在 IE 中表现得很奇怪 我创建了一个 Codepen 示例 它允许您在 IE11 中重现该错误 http codepen i
  • 从谷歌应用程序脚本预填写谷歌表单

    我有一份学生登记表 其中有学生证 这是必填字段 我有一个谷歌应用程序脚本函数 可以告诉该学生是否注册了任何课程 有没有办法通过调用 Google Apps 脚本函数 是 或 否 来自动填写注册的现场课程 是的 您可以使用表单 ID 创建预填
  • 有没有办法有条件地应用注释?

    在我的 java play 应用程序中 我有注释 RequiresAuthentication clientName CasClient 在我的控制器内 我只想在生产环境中对用户进行身份验证 如何有条件地应用注释 如果我处理身份验证的方式是
  • 在 as3 中获取对象值的最快方法

    好吧 我发誓这个问题应该无处不在 但事实并非如此 我有一个值对象 里面有很多 getter setter 它不是一个动态类 我迫切需要搜索充满它们的 ArrayCollection 搜索涵盖所有领域 因此我将使用大约 13 种不同类型的 V
  • 测试带有浮点数的元组的断言

    我有一个函数返回一个元组 其中包含一个浮点值 通常我使用assertAlmostEquals比较它们 但这不适用于元组 此外 元组还包含其他数据类型 目前 我正在单独断言元组的每个元素 但这对于此类元组的列表来说太多了 对于这种情况 有什么
  • 如何让 JavaScript 随着时间的推移(而不是立即)写入结果?

    我有一个程序 它会写入很多 if 结果 例如 这个 const a prompt for let i 1 i lt a i console log i 不是实际的代码 因此 当您输入一个大数字时 会有大量答案等待输入控制台 因此 当达到某个