JavaScript实现sleep睡眠函数的几种简单方法总结

 更新时间:2023年01月05日 11:24:14   作者:谢向晚  
sleep是一种函数,他的作用是使程序暂停指定的时间,起到延时的效果,下面这篇文章主要给大家介绍了关于JavaScript实现sleep睡眠函数的几种简单方法总结,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

一.什么是sleep函数?

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实现

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

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

附:还有一种死循环写法(参考自网络)

思路是利用系统时间,一旦没有运行到自己设定的时间就让程序一直在循环里计算(个人感觉实现简单,实际运行可能有点恐怖)

function sleep(numberMillis) { 
    //记录当前时间
    var now = new Date(); 
    //设置未来的某个时间
    var exitTime = now.getTime() + numberMillis; 
    while (true) { 
        //获取当前时间
        now = new Date(); 
        //检查是否到了设置好的未来时间
        if (now.getTime() > exitTime) 
        return; 
    } 
}

总结

到此这篇关于JavaScript实现sleep睡眠函数的几种简单方法总结的文章就介绍到这了,更多相关JS实现sleep睡眠函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 微信小程序如何获取用户头像和昵称

    微信小程序如何获取用户头像和昵称

    这篇文章主要介绍了微信小程序如何获取用户头像和昵称,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • js 求时间差的实现代码

    js 求时间差的实现代码

    下面小编就为大家带来一篇js 求时间差的实现代码。小编觉得挺不错的,现在分享给大家。也给大家做个参考。一起跟随小编过来看看吧
    2016-04-04
  • JavaScript XML操作 封装类

    JavaScript XML操作 封装类

    最近研究XML 用JavaScript写了一个简单的XML读取的操作类发给大家分享一下 可兼容 IE 火狐 Safari Chrome 6月30日下午 新修改了一下
    2009-07-07
  • JavaScript中数组flat方法的使用与实现方法

    JavaScript中数组flat方法的使用与实现方法

    在Array的显示原型下有一个flat方法,可以将多维数组,降维,传的参数是多少就降多少维,下面这篇文章主要给大家介绍了关于JavaScript中数组flat方法的使用与实现的相关资料,需要的朋友可以参考下
    2022-08-08
  • 深入探讨JavaScript中Class的语法与使用

    深入探讨JavaScript中Class的语法与使用

    这篇文章将带大家深入探讨 class 在 JavaScript 中的作用、语法和使用方法,并与 ES5 构造函数进行对比,希望可以帮助大家更好地理解和应用类的概念
    2023-06-06
  • 微信小程序使用picker组件出现的问题探究

    微信小程序使用picker组件出现的问题探究

    这篇文章主要介绍了微信小程序自定义可搜索的picker组件,主要包括自定义可搜索的picker组件的代码以及调用实例,这里的搜索框使用的是vant微信小程序组件库,picker使用的微信小程序的原生组件,需要的朋友可以参考下
    2023-01-01
  • javascript 命名空间以提高代码重用性

    javascript 命名空间以提高代码重用性

    为你封装的javascript库加上命名空间以提高代码重用性
    2008-11-11
  • js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法

    js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法

    这篇文章主要介绍了js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法,较为详细的分析了错误的原因及对应的解决方法,需要的朋友可以参考下
    2015-04-04
  • url传递的参数值中包含&时,url自动截断问题的解决方法

    url传递的参数值中包含&时,url自动截断问题的解决方法

    下面小编就为大家带来一篇url传递的参数值中包含&时,url自动截断问题的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Javascript模仿淘宝信用评价实例(附源码)

    Javascript模仿淘宝信用评价实例(附源码)

    这篇文章主要介绍了Javascript模仿淘宝信用评价功能实现方法,以完整实例形式分析了JavaScript响应鼠标事件动态改变页面元素的相关技巧,并附带了完整的实例代码供读者下载参考,需要的朋友可以参考下
    2015-11-11

最新评论