位置: IT常识 - 正文

JavaScript中实现sleep睡眠函数的几种简单方法(js实现功能)

编辑:rootadmin
JavaScript中实现sleep睡眠函数的几种简单方法

目录

一.什么是sleep函数?

二.为什么使用sleep?

三.实现sleep


一.什么是sleep函数?

推荐整理分享JavaScript中实现sleep睡眠函数的几种简单方法(js实现功能),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript+,javascriptz,js类的实现,javascript运用,js类的实现,js类的实现,js类的实现,javascriptz,内容如对您有帮助,希望把文章链接给更多的朋友!

sleep是一种函数,他的作用是使程序暂停指定的时间,起到延时的效果。

官方介绍:sleep是一种函数,作用是延时,程序暂停若干时间,在执行时要抛出一个中断异常,必须对其进行捕获并处理才可以使用这个函数。

例如:

console.log('1');sleep(2000);console.log('2');

控制台输出数字1后 会间隔2秒后输出数字2

当然上面的代码是不能执行的,因为js中是没有sleep方法的。

所以这一篇文章主要介绍几种在js中实现sleep的方式。

二.为什么使用sleep?

看到这里有人会问了,为什么要使用sleep,上面的例子我可以使用setTimeout来实现啊?

因为setTimeout是通过回调函数来实现定时任务的,所以在多任务的场景下就会出现回调嵌套:

console.time('runTime:'); setTimeout(() => { console.log('1'); setTimeout(() => { console.log('2') setTimeout(() => { console.log('3') console.timeEnd('runTime:'); }, 2000); }, 3000); }, 2000);//结果://1//2//3//runTime:: 7017.87890625 ms

上面的方式存在回调嵌套的问题,我们希望可以利用sleep函数更方便优雅地实现上面的例子。

三.实现sleep

接下来我们就分别用几种不同的方法来实现下sleep方法:

基于Date实现

JavaScript中实现sleep睡眠函数的几种简单方法(js实现功能)

通过死循环来阻止代码执行,同时不停比对是否超时。

function sleep(time){ var timeStamp = new Date().getTime(); var endTime = timeStamp + time; while(true){ if (new Date().getTime() > endTime){ return; } }}console.time('runTime:');sleep(2000);console.log('1');sleep(3000);console.log('2');sleep(2000);console.log('3');console.timeEnd('runTime:');// 1// 2// 3// runTime:: 7004.301ms

缺点:

以上的代码不会让线程休眠,而是通过高负荷计算使cpu无暇处理其他任务。

这样做的缺点是在sleep的过程中其他所有的任务都会被暂停,包括dom的渲染。

所以sleep的过程中程序会处于假死状态,并不会去执行其他任务

基于Promise的sleep

单纯的Promise只是将之前的纵向嵌套改为了横向嵌套:

function sleep(time){ return new Promise(function(resolve){ setTimeout(resolve, time); });}console.time('runTime:');console.log('1');sleep(1000).then(function(){ console.log('2'); sleep(2000).then(function(){ console.log('3'); console.timeEnd('runTime:'); });});console.log('a');// 1// a// 2// 3// runTime:: 3013.476ms

这其实和之前的setTimeout嵌套没什么区别,也很难看。

我们再次进行优化,使用ES6的Generator函数来改写上面的例子

基于Generator函数的sleep

我们对sleep的执行使用Generator函数来执行,并且搭配co来进行自执行。

var co = require('co');function sleep(time){ return new Promise(function(resolve){ setTimeout(resolve, time); });}var run = function* (){ console.time('runTime:'); console.log('1'); yield sleep(2000); console.log('2'); yield sleep(1000); console.log('3'); console.timeEnd('runTime:');}co(run);console.log('a');// 1// a// 2// 3// runTime:: 3004.935ms

可以看到整体的代码看起来不存在嵌套的关系,并且执行过程不会发生假死情况,不会阻塞其他任务的执行。

但是多了一个co执行器的引用,所以还是有瑕疵。

基于async函数的sleep

async函数最大的特点就是自带执行器,所以我们可以不借助co来实现sleep了

function sleep(time){ return new Promise((resolve) => setTimeout(resolve, time));}async function run(){ console.time('runTime:'); console.log('1'); await sleep(2000); console.log('2'); await sleep(1000); console.log('3'); console.timeEnd('runTime:');}run();console.log('a');// 1// a// 2// 3// runTime:: 3009.984ms
本文链接地址:https://www.jiuchutong.com/zhishi/298931.html 转载请保留说明!

上一篇:快速上手Amazon SageMaker动手实验室(快速上手:华硕路由器的wireguard服务器)

下一篇:Vue项目实战——【基于 Vue3.x + Vant UI】实现一个多功能记账本(搭建开发环境)(vue做项目的流程)

  • epson打印机怎么连接手机(epson打印机怎么清洗)

    epson打印机怎么连接手机(epson打印机怎么清洗)

  • 微信可以删除对方列表的自己吗(微信可以删除对方和自己的聊天记录吗)

    微信可以删除对方列表的自己吗(微信可以删除对方和自己的聊天记录吗)

  • opporeno 4pro是5g手机还是4g呢(opporeno4pro5g好用吗?)

    opporeno 4pro是5g手机还是4g呢(opporeno4pro5g好用吗?)

  • iphone11充电器是多少w的(iphone11充电器是多少伏多少A)

    iphone11充电器是多少w的(iphone11充电器是多少伏多少A)

  • 二手显示器去哪买(二手显示器去哪里卖)

    二手显示器去哪买(二手显示器去哪里卖)

  • 抖音怎么发表自己的视频(抖音怎么发表自己唱的歌)

    抖音怎么发表自己的视频(抖音怎么发表自己唱的歌)

  • 红米gps的修复教程(红米gps设置在哪里设置)

    红米gps的修复教程(红米gps设置在哪里设置)

  • 数据通信的系统模型由哪三部分组成(数据通信的系统模型由数据源什么数据数三部分组成)

    数据通信的系统模型由哪三部分组成(数据通信的系统模型由数据源什么数据数三部分组成)

  • 快手管理员是干嘛的(快手管理员是干什么的)

    快手管理员是干嘛的(快手管理员是干什么的)

  • 对方的朋友圈不显示了(对方的朋友圈不显示了是为什么)

    对方的朋友圈不显示了(对方的朋友圈不显示了是为什么)

  • cpu电压多少正常范围(cpu电压多少正常台式机)

    cpu电压多少正常范围(cpu电压多少正常台式机)

  • 3mbps等于多少kbps(3mbps等于多少kb/s)

    3mbps等于多少kbps(3mbps等于多少kb/s)

  • 拼多多怎么使用复活卡(拼多多怎么使用亲属卡)

    拼多多怎么使用复活卡(拼多多怎么使用亲属卡)

  • 苹果x为什么用电特别快(苹果x为什么用不了电信卡)

    苹果x为什么用电特别快(苹果x为什么用不了电信卡)

  • 拼多多月卡怎么关闭(拼多多月卡怎么送给好友)

    拼多多月卡怎么关闭(拼多多月卡怎么送给好友)

  • a13比a12提升多少(a13比a12强多少对于普通人)

    a13比a12提升多少(a13比a12强多少对于普通人)

  • 星火英语收不到验证码(星火英语扫码出不来)

    星火英语收不到验证码(星火英语扫码出不来)

  • 华为p30夜景怎么拍(华为p30介绍夜景功能怎样调出夜视)

    华为p30夜景怎么拍(华为p30介绍夜景功能怎样调出夜视)

  • vivoy93有语音助手吗(vivoy93手机的语音助手怎么喊才会跳出来)

    vivoy93有语音助手吗(vivoy93手机的语音助手怎么喊才会跳出来)

  • iphone快捷键小圆标(iphone快捷键小圆标怎么去掉)

    iphone快捷键小圆标(iphone快捷键小圆标怎么去掉)

  • 为什么wifi有信号却连接不上?(为什么wifi有信号没网络)

    为什么wifi有信号却连接不上?(为什么wifi有信号没网络)

  • 【网络应用开发】实验1--Servlet技术及应用(网络应用开发技术)

    【网络应用开发】实验1--Servlet技术及应用(网络应用开发技术)

  • 【Pytorch】torch.nn.init.xavier_uniform_()(pytorch torch)

    【Pytorch】torch.nn.init.xavier_uniform_()(pytorch torch)

  • 织梦采集中用到的一些过滤规则(织梦如何采集文章)

    织梦采集中用到的一些过滤规则(织梦如何采集文章)

  • 公司购进一台不需要安装的设备设备价款为700万元
  • 报废固定资产可以收定金吗合法吗
  • 总资产报酬率的计算公式
  • 不动产租赁开票税目
  • 记账王怎么查询凭证
  • 自然人个税申报错误怎么更改?
  • 年末未分配利润怎么处理
  • 销售费用可以提取现金吗
  • 承兑汇票能直接兑换吗
  • 备用金无发票怎么做账
  • 房贷利息抵个税细则 两套房
  • 自产货物用于在建工程要交增值税吗
  • 保证金可以抵货款吗
  • 国企不交社保怎么办
  • 少计提的增值税怎么处理
  • 没有签订劳动合同员工离职怎么处理
  • 今年交上年税审核要多久
  • 结转成本计算方法
  • 怎么看是不是专用发票
  • 发出商品确认收入的条件
  • 来料加工的生产企业
  • 资管公司如何缴纳流转税?
  • 商业现金折扣计算
  • 冲暂估怎么做分录
  • 个体工商户给员工交社保属于职工社保吗
  • 苹果电脑macos big sur
  • win 安全
  • macbookpro提醒事项
  • 出口企业免抵退是什么意思
  • PHP:oci_new_connect()的用法_Oracle函数
  • Linux系统中怎么定位到java代码的方法级
  • 公允价值计量模式与账面价值计量模式的区别与联系
  • 存货损失是指什么
  • 企业低值易耗品摊销计入产品成本的方法
  • 公司借款利息可以用对公户转账吗
  • 信用减值损失在资产负债表中怎么表示
  • element插件安装方法
  • 纳税申报期和税款所属期的区别
  • 以前年度的应交税费贷方怎么调平
  • 资产负债表日后事项包括哪些
  • 小规模纳税人印花税减半征收政策
  • 个人所得税专项附加扣除赡养老人
  • 科技型中小企业享受优惠税收政策
  • sqlserver2008sa用户不能登录
  • mysql导出用户和权限
  • 商业保理怎么账务处理?
  • 房产增值税发票可以抵税吗
  • 企业关联业务往来情况怎么申报
  • 分配现金股利如何做会计分录
  • 销售边角料税率是多少
  • 外经证如何缴税
  • 应付票据转应付账款分录
  • 企业微信收款如何交税
  • 固定资产计提完了怎么处理
  • 过路费油费计入什么费用
  • 去年的物业费今年收到了可以确认收入吗
  • mysql precision
  • 利用pt-heartbeat监控MySQL的复制延迟详解
  • mysql 5.7.13 winx64安装配置方法图文教程(win10)
  • mac电脑技巧
  • ie的进程
  • 用diskgenius硬盘格式转换怎么使用
  • win7一直处于开机界面
  • windows7如何启动任务管理器
  • Linux CentOS系统下tomcat配置ssl教程
  • gho文件过大
  • 铁嘴银牙剧情简介
  • 贝塞尔曲线pr怎么用
  • 刀塔ug是谁
  • edittext弹出软键盘
  • 批量数据验证
  • activity启动流程图解
  • 批处理的扩展名
  • IEnumerator/ IEnumerable/ yield return/ StartCoroutine 详解
  • javascript查看数据类型
  • JavaScript中的数据类型
  • 江西省税务局发票查询系统
  • 国家税务局的单位性质是什么
  • 黑龙江国税电子税务局官网登录
  • 车船税新标准计算办法
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设