JS实现停留几秒sleep,Js中for循环的阻塞机制,setTimeout延迟执行

//第一种,使用while循环
function sleep(delay) {var start = (new Date()).getTime();while((new Date()).getTime() - start < delay) {continue;}
}
//或者使用for循环
function sleep(delay) {for(var t = Date.now(); Date.now() - t <= d;);
}

这种实现方式是利用一个伪死循环阻塞主线程。因为JS是单线程的。所以通过这种方式可以实现真正意义上的sleep()。
Js阻塞机制,跟Js引擎的单线程处理方式有关,每个window一个JS线程。所谓单线程,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码。
由于浏览器是事件驱动的(Event driven),因此浏览器中很多行为是异步(Asynchronized)的,很容易有事件被同时或者连续触发。当异步事件发生时,会创建事件并放入执 行队列中,等待当前代码执行完成之后再执行这些代码,如鼠标点击事件发生、定时器触发事件发生、XMLHttpRequest完成回调这些事件,都会被放 入执行队列中等待。关于Js的阻塞机制,可以看下面一段代码,一般,我们会认为,这段代码会log出来0,1,2

for(var i = 0; i < 3; i++) {setTimeout(function() {console.log(i);}, (i + 1) * 1000);
}

而实际上,这段代码log出来的结果是 3,3,3。这是js新手很容易遇到的问题,具体原因就是因为for循环的阻塞机制。在上面的代码中,setTimeout这个定时器需要等待for循环 执行完成,而for循环执行完成了之后,i已经为3了,此时才开始执行setTimeout,因此console.log(i)会是3。至于为什么i会是3,请回顾一下for循环的执行顺序,当i为2的时候,满足循环条件,执行代码块,然后i++,此时i为3,不满足循环条件,不执行代码块,循环停止。对于for循环,记住,是在不满足条件的情况下停止循环,对于以上代码,可以看出,i=3的时候才不满足。

怎么解决事件阻塞

for(var i = 0; i < 3; i++) {(function(i) {setTimeout(function() {console.log(i);}, (i + 1) * 1000);})(i)
}

再上面的代码中,我们加了一个立即执行的匿名函数,并且将for循环的i作为实参传入进去。这样,setTimeout就会被立即执行,而不会等待(这里不太了解细节,就不多说了,大概猜测为新开了一个临时的线程,立即执行匿名函数,然后再立即切换回来)。本文主要在说明如何解决这一类问题,对于底层原理,还待继续挖掘。注意:html5支持Web worker功能,可以写多线程。

JS如何利用阻塞机制实现停留几秒sleep相关推荐

  1. Js中for循环的阻塞机制

    Js阻塞机制,跟Js引擎的单线程处理方式有关,每个window一个JS线程.所谓单线程,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码. 由于浏览器是事件驱动的(Event driven) ...

  2. 好程序员web前端分享JS引擎的执行机制

    好程序员web前端分享JS引擎的执行机制,请先着重牢记两点!JS是单线程语言. JS的EventLoop是JS的执行机制.深入了解JS的执行,就等于深入了解JS里的eventloop. 1.灵魂三问: ...

  3. 利用消息机制实现.NET AOP(面向方面编程)--基本概念和实现

    本系列文章主要讲述如何利用.NET的Remoting消息框架实现AOP 本系列文章试图实现三种AOP实现 本系列文章以示例代码为主,对一些概念和原理不会进行过于深入的讨论 这里不谈论AOP在现实开发中 ...

  4. Linux中的阻塞机制

    我们知道在字符设备驱动中,应用层调用read.write等系统调用终会调到驱动中对应的接口. 可以当应用层调用read要去读硬件的数据时,硬件的数据未准备好,那我们该怎么做? 一种办法是直接返回并报错 ...

  5. android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...

    想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...

  6. 利用委托机制处理.NET中的异常

    利用委托机制处理.NET中的异常<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&quo ...

  7. 【Android 异步操作】Handler 机制 ( MessageQueue 消息队列的阻塞机制 | Java 层机制 | native 层阻塞机制 | native 层解除阻塞机制 )

    文章目录 一.MessageQueue 的 Java 层机制 二.MessageQueue 的 native 层阻塞机制 三.MessageQueue 的 native 层解除阻塞机制 三.Messa ...

  8. js的事件循环机制:同步与异步任务(setTimeout,setInterval)宏任务,微任务(Promise,process.nextTick)...

    javascript是单线程,一切javascript版的"多线程"都是用单线程模拟出来的,通过事件循环(event loop)实现的异步. javascript事件循环 事件循环 ...

  9. 利用反射机制获取未知类型的枚举的信息

    原文:利用反射机制获取未知类型的枚举的信息 开发游戏设置选项遇到一个问题,我有两个枚举,一个是屏幕分辨率,一个是语言 我需要在不知道一个枚举到底是哪一个枚举类型的情况下,获取这个枚举的值以及这个枚举类 ...

最新文章

  1. 关于图片上传的个人摘要
  2. SAP UI5 oList.bindAggregation(item) will trigger odata request
  3. 【5】C++语法与数据结构之STL_list学生管理系统_链表内排序_函数指针
  4. Springboot与Spring的关系
  5. 小红书点赞收藏有什么用_橱柜门用什么材料好?老师傅开口说话了!听进去算你的,收藏备用...
  6. Error:Execution failed for task ':app:transformClassesWithDexForDebug'解决记录
  7. efuse 加密文件 linux,乐鑫关于“故障注入”和 “eFuse 保护”的安全建议 (CVE-2019-17391)...
  8. 关于IE、Firefox、Opera页面呈现异同(转载)
  9. 剑指Offer:跳台阶
  10. php过滤iframe,php过滤XSS攻击的函数
  11. 《应用时间序列分析:R软件陪同》——1.3 R软件入门
  12. 咱用AppDesigner开发复现了一款我国古老的桌游 —【升官图】
  13. 华为鸿蒙主机,华为发布全屋智能主机以及V系列智慧屏 搭载鸿蒙系统
  14. 已解决在向有外键表插入数据提示“foreign key constraint fails”
  15. 高仿android 版微信(服务端,客户端都有)
  16. 黑客捣毁了个暗网杀手网站,却险些触发了世界各地的多起杀戮...
  17. CentOS7修改主机名的三种方法
  18. vue自定义星星评分组件rater,可自定义星星图片,大小,暂不支持半颗星
  19. 解决Themida加壳程序在VMware虚拟机无法运行问题_HS_TMD
  20. 易语言制作一款屏幕锁,锁屏并且透明

热门文章

  1. 电磁波传播相位是否会变化,关于电磁波的相位不变性和多普勒效应的讨论
  2. 风枪bga芯片焊接方法参数技巧
  3. 阿里云上基于WordPress快速搭建个人博客
  4. 2022年团体程序设计天梯赛C++个人题解附带解题思路
  5. Caff-Opencv——图像分类(01)
  6. 他的成功不可复制——听洪小文讲座有感
  7. 连载26:软件体系设计新方向:数学抽象、设计模式、系统架构与方案设计(简化版)(袁晓河著)...
  8. 用思科模拟器实现三层交换机下不同VLAN之间的通信
  9. 极光推送:java后台向APP推送消息(android,ios极光推送消息)
  10. java previous_Java BreakIterator previous()用法及代码示例