带有阻塞代码的 setTimeout 行为

2024-03-04

这是我的测试代码(小提琴here http://jsfiddle.net/Xvh55/):

console.log('Before wait');
setTimeout(function () { console.log('Yo!'); }, 1000);
var start = Date.now();
while (Date.now() < start + 3000) {}
console.log('After wait');

这是 Chrome 中事件的时间表:

  • 时间 0 秒:打印“Before wait”
  • 时间 3 秒:打印“After wait”,然后紧接着“Yo!”

这种行为符合规范吗?为什么不是

  • 时间 0 秒:打印“Before wait”
  • 时间 3 秒:打印“等待后”
  • 时间 4 秒:打印“Yo!”

?


JavaScript 是单线程的。如果某个代码块使用执行线程,则无法执行其他代码。这意味着您的setTimeout()调用必须等到主执行(忙等待的那个)while循环)结束。

发生的事情是这样的:你安排setTimeout()一秒后执行,然后阻塞主线程 3 秒。这意味着当你的繁忙循环结束时,超时已经晚了 2 秒 - 并且 JS 引擎试图通过尽快调用你的超时来跟上 - 即立即。

事实上这个:

while (Date.now() < start + 3000) {}

这是 JavaScript 中最糟糕的事情之一。您将 JavaScript 执行线程保持 3 秒,并且无法执行其他事件/回调。通常浏览器会在那段时间“冻结”。

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

带有阻塞代码的 setTimeout 行为 的相关文章

随机推荐

  • AngularJS 控制器继承

    AngularJS 具有基于 DOM 的控制器继承 如 Angular 文档中所述 div p Base Controller Value value p div
  • `2>/dev/null` 在 Makefile 中不起作用

    我试图抑制错误rm通过书写命令 生成文件 clean wildcard mod rm 2 gt dev null I ran make clean rm 2 gt dev null make clean Error 64 ignored 我
  • 为什么 strlcpy 和 strlcat 被认为不安全?

    我明白那个strlcpy and strlcat被设计为安全替代品strncpy and strncat 但仍有一些人认为他们不安全 并且只会导致不同类型的问题 https en wikipedia org wiki C string ha
  • 如何在 Rails 中设置哈希表单?

    我有一些与散列中的模型关联的数据 哈希值在控制器中生成 hash 为这些数据创建表单的正确方法是什么 我为视图想出了以下代码 div class field br div 这会生成表单 但它将每个哈希项创建为表单中的单独变量 这似乎不是提交
  • 如何在Python 3中保留xmlrpc.client的cookie?

    默认Pythonxmlrpc client Transport 可与xmlrpc client ServerProxy 不保留 cookie 而基于 cookie 的登录有时需要 cookie 例如 以下代理与 TapaTalk API 一
  • Polymer - dom-repeat 和 DOM 树中元素数据的缓存

    以下场景 我有一个 Firebase 数据库 其中包含一个列表 用于创建一组 纸卡 dom repeat
  • 如何以编程方式将操作添加到 Delphi 2010 中的操作管理器

    我正在尝试动态添加操作项目 我可以添加该项目 并且当我这样做时它会起作用 HostActionItem ActionManager ActionBars 0 Items 0 Items 2 NewItem HostAction Items
  • mac os X 上的 vim 功能键映射不起作用

    I have recently started using a Mac OS X Lion system and tried to use Vim in terminal I previously had a vimrc file in m
  • 如何在材料设计中使用 appCompat 自定义上下文操作栏

    MainActivity java 我已经实施了MultiChoiceModeListener在这个类中 下面是代码 on listView listView setMultiChoiceModeListener MainActivity
  • 根据绘图选择过滤 Bokeh 数据表

    我正在尝试根据绘图选择按数据表进行过滤 我陷入了合并 cb obj 的困境 我生成一个散点图 我想在其中选择任意点 选择后 我想用所选 y 或 x 值大于第二个数据源 即 DataTable 的数据源 中的值的值填充表 from rando
  • 如何防止 SIGPIPE(或正确处理它们)

    我有一个小型服务器程序 它接受 TCP 或本地 UNIX 套接字上的连接 读取一个简单的命令并 取决于命令 发送回复 问题是客户可能对答案不感兴趣 有时会提前退出 所以写入该套接字将导致SIGPIPE并使我的服务器崩溃 防止这里崩溃的最佳做
  • 还有其他方法让 Laravel 重新加载环境变量吗?

    我在知名主机上有一个共享托管帐户 我的 Laravel 网站已上传并大部分正常运行 但我必须改变环境 现在我无法让 Laravel 看到更改 我知道这是常见问题 我尝试运行 artisan 命令来清除配置和缓存 php artisan co
  • 在 Opencart 管理“订单信息”页面上添加自定义字段

    我想在 opencart 管理订单页面上添加自定义字段 比较值 如 ifoc order order id oc custom table order id然后显示oc custom table comment在管理订单列表上 在管理订单信
  • 用Java实现Matlab的rgb2gray

    我正在尝试实现Matlab的rgb2gray在Java中根据http www mathworks com help toolbox images ref rgb2gray html http www mathworks com help t
  • Dropbox直接从浏览器上传文件

    我正在尝试将文件直接上传到 dropbox 从浏览器 网络应用程序 代码 API 上的 uploadFile 函数需要上传服务器上可用的文件 这给我带来了麻烦 因为我不想要任何文件要上传到我的服务器并从那里上传到保管箱 f fopen te
  • 所有特征必须在 [0, 9] 或 [-10, 0] 范围内

    我有以下代码 df load data pd set option display max columns None df dtypes intBillID object chBillChargeCode object chBillNo o
  • 如何管理非托管 Eclipse 格式化配置文件?

    我们的项目有一个 非托管配置文件 和节省时间的自动格式化 我希望能够修改此非托管配置文件的设置 并能够将它们重新签入版本控制 Eclipse 的帮助文档非常没有帮助 您不允许更改这样的配置文件 只有配置文件的创建者 管理员 可以更改它 我不
  • 在 Erlang 中编写和编译自定义行为

    我试图在 Erlang 中编写并编译自定义行为 我找不到任何关于如何编译此行为的明确文档 module bla export start link 0 behaviour info 1 behaviour info callbacks gt
  • 如何调试grpc调用?

    我试图找出为什么我的grpc http grpc iocall 不起作用 但我不知道如何打开调试 因此我可以看到通过 grpc 连接发送和接收的数据 如何打开 grpc 调用的调试 您可以设置GRPC TRACE环境变量为all让 grpc
  • 带有阻塞代码的 setTimeout 行为

    这是我的测试代码 小提琴here http jsfiddle net Xvh55 console log Before wait setTimeout function console log Yo 1000 var start Date