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

  • 微信视频脸大怎么调小(微信视频的时候脸宽了)

    微信视频脸大怎么调小(微信视频的时候脸宽了)

  • useradmin的密码是多少(useradmin的密码是wifi密码吗)

    useradmin的密码是多少(useradmin的密码是wifi密码吗)

  • 微信换实名认证零钱怎么办(微信换实名认证后好友还在吗)

    微信换实名认证零钱怎么办(微信换实名认证后好友还在吗)

  • boss上投诉对方能看到吗(boss投诉招聘者后招聘者会怎样)

    boss上投诉对方能看到吗(boss投诉招聘者后招聘者会怎样)

  • nova7 se区别(nova7 se和nova7哪个贵)

    nova7 se区别(nova7 se和nova7哪个贵)

  • 电脑上的文件夹怎么发送到QQ上(电脑上的文件夹如何加密码)

    电脑上的文件夹怎么发送到QQ上(电脑上的文件夹如何加密码)

  • 三星为什么取消红外功能(三星为什么取消心率传感器)

    三星为什么取消红外功能(三星为什么取消心率传感器)

  • 平衡车亮红灯滴滴响(平衡车红灯闪烁一直响)

    平衡车亮红灯滴滴响(平衡车红灯闪烁一直响)

  • 快手有什么用(快手有什么用户)

    快手有什么用(快手有什么用户)

  • 京东买家如何修改评价(京东修改)

    京东买家如何修改评价(京东修改)

  • 小米手机有没有实况模式(小米手机有没有nfc功能)

    小米手机有没有实况模式(小米手机有没有nfc功能)

  • 10gbps是多少兆(10mbps等于多少兆)

    10gbps是多少兆(10mbps等于多少兆)

  • 手机交了话费怎么还是停机(手机交了话费怎么还是暂停服务)

    手机交了话费怎么还是停机(手机交了话费怎么还是暂停服务)

  • 华为mate30带膜吗(华为mate30带贴膜吗)

    华为mate30带膜吗(华为mate30带贴膜吗)

  • 华为mate20怎么切后台(华为mate20怎么切换桌面滑动效果)

    华为mate20怎么切后台(华为mate20怎么切换桌面滑动效果)

  • vivo手机手电筒打开不亮(vivo手机手电筒在哪里设置)

    vivo手机手电筒打开不亮(vivo手机手电筒在哪里设置)

  • 港版iphonex支持电信卡吗(港版iphonex支持V0LTE)

    港版iphonex支持电信卡吗(港版iphonex支持V0LTE)

  • 相互宝分摊怎么退出(相互宝分摊怎么关闭)

    相互宝分摊怎么退出(相互宝分摊怎么关闭)

  • 苹果怎么看充电次数(苹果怎么看充电宝电量)

    苹果怎么看充电次数(苹果怎么看充电宝电量)

  • 抖音猪头特效怎么弄(安卓抖音猪头特效教程)

    抖音猪头特效怎么弄(安卓抖音猪头特效教程)

  • smg9650ds是什么型号

    smg9650ds是什么型号

  • iPhone X怎样解除授权支付宝芝麻信用(苹果x如何解除id)

    iPhone X怎样解除授权支付宝芝麻信用(苹果x如何解除id)

  • oppo怎么解除耗资源高(oppo怎么解除耗电详细)

    oppo怎么解除耗资源高(oppo怎么解除耗电详细)

  • 抖音蹦迪闪光特效(抖音蹦迪闪光特效在哪里)

    抖音蹦迪闪光特效(抖音蹦迪闪光特效在哪里)

  • cad修剪快捷键(cad修剪快捷键命令tr用不了)

    cad修剪快捷键(cad修剪快捷键命令tr用不了)

  • 前端插件库之vue3使用element-plus实现登录、注册页面和忘记密码弹窗,以及已有样式的覆盖(vue前端组件库)

    前端插件库之vue3使用element-plus实现登录、注册页面和忘记密码弹窗,以及已有样式的覆盖(vue前端组件库)

  • 待转销项税额是几级科目
  • 固定资产到期账务处理
  • 什么是调账的依据
  • 小型微利企业企业所得税优惠政策2021年
  • 其他权益工具投资借贷方向
  • 理事单位和事业单位的区别
  • 免税收入要计入应纳税所得额吗
  • 一般纳税人厂房出租怎么开票
  • 购货方付款会计分录
  • 居民企业应纳税所得额税率
  • 支付给个人的佣金怎么做账务处理
  • 购进财务软件折旧怎么算
  • 行政事业单位暂付款无法收回该怎么处理
  • 含运费的原材料会计分录
  • 公司名字开错了,认证过了怎么处理
  • 水果 增值税专票
  • 转账支票怎么进账到个人账户
  • 环保设备的折旧计入
  • 购买债券发生的交易费用计入哪个科目
  • 网上申领发票怎么清卡
  • 政府购买缴纳社保吗
  • 工程施工科目月末如何结转
  • 业务招待费是收入的
  • 定金算营业收入吗
  • php utf8转unicode
  • 货物运输业增值税专用发票可以抵扣吗
  • 营业款怎么存入公司账户
  • AUTOMATIC1111/stable-diffusion-webui安装教程
  • 公司收到个人汇款怎么办
  • 语言翻译算法
  • thinkphp 手机号和用户名同时登录
  • github账号在哪里看
  • dedecms使用教程
  • 价税合计公式分配
  • java基础介绍
  • java基本框架
  • 计入当期损益的
  • 一般纳税人申报表电子版
  • 高铁票进项抵扣计算错了 怎么办理
  • 受托方代扣代缴增值税、消费税的纳税人
  • 递延收益分摊是当月还是次月
  • 消防工程公司的成本包括哪些
  • 消费税直接计入销售额吗
  • 利润分配的账务处理实验报告
  • 支付资金占用费的承诺函怎么写
  • 接待客户的旅游活动
  • 宾馆手撕发票图片
  • 关停企业的国家规定
  • 应付利润科目
  • 会计凭证装订的注意事项
  • 子公司的财务管理方法
  • 新公司建立 需要先做哪行
  • Linux/Mac MySQL忘记密码怎么办
  • sql group by语句
  • cmd命令行操作
  • win10开始菜单按重启键变成关机
  • 搜狗拼音输入法xp系统
  • win10怎么设置定时关机和开机
  • Ubuntu keylin 14.04 怎么使用root用户登录?
  • RPDFLchr.exe - RPDFLchr是什么进程 有什么用
  • os x10.10.3beta5官网下载 yosemite10.10.3beta5下载地址
  • win10桌面上怎么分成几个区域
  • mongoose怎么用
  • jquery生成网页内容
  • perl cgi
  • javascript中的类型转换
  • nodejs oom
  • 2012年腾讯股价多少
  • python os模块
  • android4.4iso
  • 工具类软件有哪些
  • js鼠标拖动窗口的做法
  • python中lxml模块
  • 酒吧要交国税还是省税
  • 双定户如何网上申报
  • 广西的高速怎么一段收费一段不收费
  • 个人所得税是按实发工资还是应发
  • 国家税务总局查询发票
  • 佩兰诗胶原蛋白填充霜真的有效果吗
  • 车辆大本怎么办理
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设