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

  • 微信24小时到账怎么撤回资金(微信24小时到账对方已收款怎么追回)

    微信24小时到账怎么撤回资金(微信24小时到账对方已收款怎么追回)

  • ps怎么截图想要的区域(ps怎么截图想要的区域快捷键)

    ps怎么截图想要的区域(ps怎么截图想要的区域快捷键)

  • 华为mate30pro可以装谷歌服务吗(华为mate30pro可以开空调吗)

    华为mate30pro可以装谷歌服务吗(华为mate30pro可以开空调吗)

  • oppo手机微信运动步数为0怎么办(oppo手机微信运动为什么数据都是0)

    oppo手机微信运动步数为0怎么办(oppo手机微信运动为什么数据都是0)

  • 毒7天无理由退货扣费吗(毒7天无理由退货怎么退)

    毒7天无理由退货扣费吗(毒7天无理由退货怎么退)

  • 邮箱发送word格式变了(word文档在邮箱里发送时格式会变)

    邮箱发送word格式变了(word文档在邮箱里发送时格式会变)

  • 抖音蓝v可以取消吗(抖音蓝v可以取消吗钱退吗)

    抖音蓝v可以取消吗(抖音蓝v可以取消吗钱退吗)

  • 微信发什么文字有东西掉下来(微信发什么文字会出现特效)

    微信发什么文字有东西掉下来(微信发什么文字会出现特效)

  • 苹果手机键盘上的回车键是哪一个(苹果手机键盘上的字怎么去掉)

    苹果手机键盘上的回车键是哪一个(苹果手机键盘上的字怎么去掉)

  • 可以清除微博的艾特记录吗(可以清除微博的缓存吗)

    可以清除微博的艾特记录吗(可以清除微博的缓存吗)

  • 微软拼音汉字输入法属于什么码(微软拼音汉字输入显示全部汉字怎么办)

    微软拼音汉字输入法属于什么码(微软拼音汉字输入显示全部汉字怎么办)

  • iphone怎样清理系统内存(iphone怎样清理系统日志)

    iphone怎样清理系统内存(iphone怎样清理系统日志)

  • ios11怎么多任务(ios如何多任务)

    ios11怎么多任务(ios如何多任务)

  • 嘀嗒退款后多久到账(嘀嗒退单)

    嘀嗒退款后多久到账(嘀嗒退单)

  • 手机耳机只有一边有声音怎么解决(手机耳机只有一只能听了怎么办)

    手机耳机只有一边有声音怎么解决(手机耳机只有一只能听了怎么办)

  • 手机退qq群怎么退出(手机qq群退群了还能恢复吗)

    手机退qq群怎么退出(手机qq群退群了还能恢复吗)

  • ios13卡通头像设置(iphone卡通头像怎么设置)

    ios13卡通头像设置(iphone卡通头像怎么设置)

  • 格外的近义词(格外的近义词是什么)

    格外的近义词(格外的近义词是什么)

  • 手机未在上网络注册是什么意思(手机显示未在上网络注册怎么解决)

    手机未在上网络注册是什么意思(手机显示未在上网络注册怎么解决)

  • 火山怎样发3分钟视频(火山怎么发视频火力多)

    火山怎样发3分钟视频(火山怎么发视频火力多)

  • 快手直播平台怎么分成(快手直播平台怎么赚钱)

    快手直播平台怎么分成(快手直播平台怎么赚钱)

  • 小米运动如何上传数据(小米运动设置具体步骤)

    小米运动如何上传数据(小米运动设置具体步骤)

  • 苹果无法激活(苹果无法激活sim卡无效)

    苹果无法激活(苹果无法激活sim卡无效)

  • 苹果耳机不响(苹果耳机不响了能修吗)

    苹果耳机不响(苹果耳机不响了能修吗)

  • 苹果键盘回车键在哪里(苹果键盘回车键怎么调出来)

    苹果键盘回车键在哪里(苹果键盘回车键怎么调出来)

  • 税务机关的义务是依法征管
  • 企业购入免税农产品
  • 什么是财务报表审计
  • 跨年取得的发票怎么入账
  • 个人所得税10月突然增加了
  • 出租车发票上没有二维码
  • 加计抵扣进项税进营业外收入
  • 期货平仓费用
  • 所得税减免优惠明细表应分摊期间
  • 结转损益类收入科目的余额其中主营业务收入
  • 建筑业统一发票税率多少
  • 季度预缴所得税可以不交吗
  • 增值税专票逾期抵扣怎么操作
  • 房产交易如何避免个税
  • 股东以实物出资需要交税吗
  • 加油款可以开专用发票吗
  • 教育费附加计算公式
  • 销售费用变动率公式
  • 消防改造费用
  • 收取国外技术服务费如何在外管申报个税
  • 委托加工物资合并报表
  • 政府给企业的钱叫什么
  • 营改增后一般纳税人税率是多少
  • win7系统没有桌面图标怎么办
  • 会计报表申报期限怎么填
  • 股东分红怎么处理
  • 子公司转为分公司,是不是需要缴纳土地增值税
  • 财政补助收入核算内容
  • vue的路由跳转了,可是页面没有变化
  • 过来人告诉你:女人最珍贵的三种东西,舍得给你说明爱你
  • nodejs安装及环境配置 centos
  • php执行另一个php
  • tracet命令
  • 管家婆软件如何做账
  • 税款已缴纳后发票怎么查
  • 股东出资证明书范本
  • opengl环境光参数
  • 租入的房屋转租是否交房产税
  • 印花税怎么交税率是多少
  • 资金结存属于资产科目吗
  • mysql命令列界面
  • 增值税税率为零的有哪些项目
  • 资产减值准备如何影响利润
  • sql server获取字段长度
  • 携程代订住宿发票
  • 冲以前年度成本分路
  • 出口退税申报系统汇率修改
  • 现金支票存根联丢失怎么办
  • 短期借款明细账采用什么格式
  • 工程类企业存货包括哪些
  • 酒店营业额下降的原因
  • 盈余公积和未分配利润合起来构成
  • 企业办增项怎样办理
  • 产成品核算的内容
  • oracle和sqlserver的区别
  • sql server默认实例
  • pg 正则表达式
  • windows xp操作
  • windows 9
  • win8蓝屏解决方法
  • 一键ghostcgi
  • win10每周更新
  • ie8-ie11浏览器
  • 搭建android开发环境需要用到哪些工具
  • android图形系统
  • css div模糊
  • 用python编写程序
  • 仿京东首页html5
  • interview分析方法
  • Unity3D游戏开发培训课程大纲
  • jquery实例
  • 大学的python选修课好学吗
  • 卸载python后模块库还用卸载吗
  • 云南新农合网上怎么交
  • 湖南省国家电子税务局官网
  • 国家税务总局发票查询官网
  • 车船税保险公司代收代缴后,单位还申报不?
  • 房产证加名字需要哪些手续和费用
  • 税务清查工作总结
  • 国家税务总局广西壮族自治区税务局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设