位置: 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做项目的流程)

  • 应纳税所得额是含税还是不含税
  • 金税盘服务费怎么抵扣税
  • 为什么对子公司长投要用成本法
  • 劳务分包企业所得税25%
  • 临时售楼处及其装修费用如何列支
  • 土地股权转让需交什么税
  • 取得的接受捐赠怎么做账
  • 向银行借款一年是长期还是短期
  • 劳务派遣税收政策文件
  • 应税销售额含不含税
  • 餐饮消费,碰到商家不愿意开发票怎么办?
  • 购入材料的应付账款包括商业折扣吗
  • 委托出口业务的账务如何处理呢?
  • 期望值E(X)怎么算例题
  • 结转基本生产成本
  • win11预览版怎么变回正式版
  • 欠款利息收入如何入账
  • php数组函数实现机选双色球
  • 开机后网络连接很慢
  • 应交增值税视频讲解
  • 弃置费用的会计核算
  • ConquerCam.exe进程的详细介绍 ConquerCam进程信息介绍
  • 企业缴纳职工社保是否可以缴纳三险
  • 增值税普通发票和专用发票有什么区别
  • php怎么发布
  • 采用公允价值模式计量的投资性房地产处置
  • 递延所得税资产和负债怎么计算
  • javaweb简单项目案例
  • 员工旅游是什么意思
  • 前端都有哪些
  • thinkphp环境搭建教程
  • 结转完工产品成本的会计分录
  • 出售一台设备,收到价款20万
  • 待抵扣进项税额的账务处理
  • 政府补助为什么是递延收益
  • 应收票据应付票据合并抵消吗
  • python中lambda用法
  • php添加
  • 营业成本的构成
  • 当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长的原因及解决办法
  • sqlserver数据库事物日志已满
  • 预提费用是应付账款吗
  • 折旧啥意思
  • 撤回或减少投资所得税处理
  • 收到所得税退税怎么做账务处理
  • 支付货代运费账务处理
  • 车辆购置税计入什么科目
  • 当月进货没有认证怎么办
  • 单据 凭证
  • 未收到发票暂估分录
  • 工伤医疗补助可以申请吗
  • 未抵扣进项税额转出会计分录
  • sql数据库怎么执行命令
  • mysql深入解析
  • sql server获取字段长度
  • ubuntu一键重装
  • Fedora 9.0 Apache+PHP+MYSQL 环境安装
  • win10系统玩dnf闪退
  • linux如何列出所有用户
  • win8账户
  • linux安装sshpass
  • 怎么在mac上查找iphone
  • windows7 cpu使用率高
  • win7格式化怎么操作?
  • linux文本操作命令
  • 如何在手机上直接买彩票
  • JAVA的OPENGL,JOGL入门实例----不断变色的点阵 (源代码)
  • 拦截器 aop
  • 深入理解计算机系统
  • shell脚本模拟ctrl
  • python中的字典怎么用
  • javascript下拉列表怎么做
  • jquery绑定数据
  • 标箭头的手机软件
  • 政务服务网怎么打印电子资格证书
  • 国税地税怎么分成
  • 广州市番禺区国丹信息管理有限公司
  • 税务注销证明样本
  • 纳税申报的期限是什么意思
  • 二手车中介公司怎么做账报税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设