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

  • 苹果13屏幕多大尺寸(苹果13屏幕多大尺寸长宽高)

    苹果13屏幕多大尺寸(苹果13屏幕多大尺寸长宽高)

  • 三星nfc功能是什么怎么用(三星的nfc是什么)

    三星nfc功能是什么怎么用(三星的nfc是什么)

  • 苹果手机强制关机怎么操作(苹果手机强制关机发出警报声)

    苹果手机强制关机怎么操作(苹果手机强制关机发出警报声)

  • 电脑版芒果tv怎么下载(电脑版芒果TV怎么开弹幕)

    电脑版芒果tv怎么下载(电脑版芒果TV怎么开弹幕)

  • iphonex储存空间其他是什么(iphonex储存空间加载慢)

    iphonex储存空间其他是什么(iphonex储存空间加载慢)

  • wpsword全文下划线怎么设置(wps文件自带的下划线填写文字不能在上面)

    wpsword全文下划线怎么设置(wps文件自带的下划线填写文字不能在上面)

  • xsmax换屏幕影响面容吗(xsmax换屏幕影响原彩吗)

    xsmax换屏幕影响面容吗(xsmax换屏幕影响原彩吗)

  • 功放开机喇叭有滋滋声(功放开机喇叭有冲击声)

    功放开机喇叭有滋滋声(功放开机喇叭有冲击声)

  • 闲鱼可以注销账号吗(闲鱼注销账户后还能重新注册吗)

    闲鱼可以注销账号吗(闲鱼注销账户后还能重新注册吗)

  • b站视频缓存文件在哪(b站视频缓存文件在哪ios)

    b站视频缓存文件在哪(b站视频缓存文件在哪ios)

  • 钉钉能不能拉黑好友(钉钉能不能拉黑老师)

    钉钉能不能拉黑好友(钉钉能不能拉黑老师)

  • 快手粉丝团标志前面还有一个标志是什么(快手粉丝团标识能显示多长时间)

    快手粉丝团标志前面还有一个标志是什么(快手粉丝团标识能显示多长时间)

  • word文档怎么改文件名(word文档怎么改文件名称)

    word文档怎么改文件名(word文档怎么改文件名称)

  • 小度智能抓拍视频储存在哪里(小度智能抓拍视频怎么看)

    小度智能抓拍视频储存在哪里(小度智能抓拍视频怎么看)

  • 手机imei是什么意思(oppo手机imei是什么)

    手机imei是什么意思(oppo手机imei是什么)

  • ipad1822是什么型号(ipad1822是air2吗)

    ipad1822是什么型号(ipad1822是air2吗)

  • 华为p30怎么拍月亮(华为p30怎么拍月亮最清楚)

    华为p30怎么拍月亮(华为p30怎么拍月亮最清楚)

  • 快手的消息删了怎么看(快手的消息删了能恢复吗)

    快手的消息删了怎么看(快手的消息删了能恢复吗)

  • 联通4ghd是什么意思

    联通4ghd是什么意思

  • iphone6 plus怎么关闭邮件推送(iphone6plus怎么关闭旁白)

    iphone6 plus怎么关闭邮件推送(iphone6plus怎么关闭旁白)

  • 华为p30和p30pro拍照区别(华为p30和p30pro拍照哪个好)

    华为p30和p30pro拍照区别(华为p30和p30pro拍照哪个好)

  • win7分屏设置(win7如何分屏显示)

    win7分屏设置(win7如何分屏显示)

  • Vue3 开发环境和生产环境打包配置(vue项目开发环境)

    Vue3 开发环境和生产环境打包配置(vue项目开发环境)

  • python累加求和代码(python累加求和代码,直到最后一项小于10^-6)

    python累加求和代码(python累加求和代码,直到最后一项小于10^-6)

  • 房地产企业的样板房费用计入哪个科目
  • 新成立的销售公司有哪些
  • 支付电费未开具发票
  • 季报利润表本月金额和本年累计金额
  • 30万免税超过30万
  • 基本户被冻结怎么缴投标保证金
  • 发票丢了企业所得怎么办
  • 调价单生成什么科目
  • 网银转账手续费标准
  • 融资租赁与经营租赁相比具有的优势
  • 应交税金在贷方怎么调
  • 个人承包经营所得是什么意思
  • 公司每年都要纳税吗?
  • 服务类的企业发票税率
  • 季报所得税可以预交吗
  • 不动产证上宗地图名字错一个字
  • 自助开税票流程
  • 建筑工程安装合同
  • 暖气冷气热水的增值税适用税率是多少?
  • 销售,购买
  • 288000元大写怎么写
  • 7年利率多少
  • 企业注册资金需要拿钱出来吗
  • 企业所得税三项费用扣除
  • 公司注销后股东承担责任的法律规定
  • 投资款怎么做会计科目
  • 电子税务局如何开票操作
  • 应付股利会计分录例题
  • 应付票据包括哪些票
  • 营业外支出的税额要进项转出吗
  • 欠税,偷税后果严重吗
  • 加拿大沿海城市有哪些
  • 对公账户自己扣钱
  • 外贸出口退税进项发票勾选
  • vue前端后端
  • 微前端的好处和缺陷
  • php如何实现
  • 发票认证相符什么意思
  • 银行存款转定期申请
  • 交易性金融资产的入账价值
  • 循环表是线性表吗
  • 出资比例不等于100%
  • dedecms5.7
  • 本期应补退税额为负数怎么申报
  • 公司的财产保险业务
  • 月末研发支出会结转至哪个账户
  • mysql备份模式
  • sql server s
  • 增值税附加税的税收优惠政策
  • 公交车经营权转让案例
  • 货拉拉平台收取费用
  • 新公司初始建账
  • sql语句中截取字符串
  • Qq浏览器怎么切换成极速模式
  • linux怎样浏览文件中的内容
  • linux -al
  • 怎么清理win7
  • 特俗字符
  • win10家庭版关闭
  • centos6.5配置ssh
  • 盗版win7怎么升级
  • centos 6.0
  • win8系统怎么重新安装系统
  • win10系统如何创建家庭组
  • win8如何安装
  • android如何导入文件
  • Node.js中的全局对象有
  • android 一个绚丽的loading动效分析与实现!
  • unity协程会阻塞主线程吗
  • js如何获取浏览器窗口大小
  • shell脚本 ftp
  • unity动画animator
  • js赋值input
  • [置顶]bilinovel
  • 会计餐费费的会计分录
  • 贵阳市税务稽查
  • 完税证明在哪里查询打印
  • 辽宁省地方税务局公告2014年第10号
  • 个体户不用开发票只纳税和记账的话还会罚款吗?
  • 浙江欧派和广东欧派哪个好
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设