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

这篇具有很好参考价值的文章主要介绍了JavaScript中实现sleep睡眠函数的几种简单方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.什么是sleep函数?

二.为什么使用sleep?

三.实现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方法:

  1. 基于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的过程中程序会处于假死状态,并不会去执行其他任务

  2. 基于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函数来改写上面的例子

  3. 基于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执行器的引用,所以还是有瑕疵。

  4. 基于async函数的sleep

    async函数最大的特点就是自带执行器,所以我们可以不借助co来实现sleep了文章来源地址https://www.toymoban.com/news/detail-788187.html

    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

到了这里,关于JavaScript中实现sleep睡眠函数的几种简单方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaScript中数据过滤的几种方法

    JavaScript是一种广泛使用的编程语言,它提供了多种方法来对数据进行过滤。在本文中,我们将介绍JavaScript中常见的几种数据过滤方法,并提供相应的示例。 filter()方法是JavaScript数组对象的一个内置方法,它创建一个新数组,其中包含符合指定条件的所有元素。该方法接受一

    2024年02月04日
    浏览(34)
  • JavaScript中 判断网络状态的几种方法

    1. 使用 Navigator onLine 属性 Navigator onLine 属性判断浏览器是否在线,在线返回 true,离线返回 false; Navigator onLine 是只读属性,所有主流浏览器都支持 onLine 属性; 2. 使用 ononline、onoffline 事件 这两个方法属于 “侦听器”,在网络连接 / 断开的瞬间会触发(当网络从离线变为在

    2024年01月24日
    浏览(37)
  • 使用JavaScript关闭浏览器窗口的几种方法

    在Web开发中,有时候我们需要通过JavaScript来控制用户的浏览器行为,其中之一就是关闭浏览器窗口。本文将介绍几种使用JavaScript关闭浏览器窗口的方法,并提供相应的源代码示例。 使用window.close方法关闭窗口 要关闭当前窗口,可以使用window.close方法。这个方法会关闭当前浏

    2024年02月04日
    浏览(41)
  • selenium WebDriver 中的几种等待--sleep(),implicitly_wait(),WebDriverWait()

    目录 强制等待:sleep() 隐式等待:implicitly_wait() 显示等待:WebDriverWait() 与until()或者until_not()方法结合使用 WebDriverWait与expected_conditions结合使用 显示等待,自定义等待条件 设置固定休眠时间,单位为秒。 由python的time包提供, 导入 time 包后就可以使用。 缺点:不智能,使用太多的

    2024年02月16日
    浏览(29)
  • JavaScript判断对象是否为空对象的几种方法

    目录 1、空对象对应的字符串为 \\\"{}\\\" 2、for in 3、jquery 的 isEmptyObject()方法 4、Object.getOwnPropertyNames() 5、ES6 的 Object.keys() JSON.stringify()扩展 1、第一大特性 小结 2、第二大特性 3、第三大特性 4、第四大特性 5、第五大特性 6、第六大特性 7、第七大特性 8、第八大特性 var data = {}; v

    2024年01月16日
    浏览(67)
  • 【JavaScript】 发送 POST 请求并带有 JSON 请求体的几种方法

     在现代的前端开发中,与后端进行数据交互是必不可少的。其中,发送 POST 请求并带有 JSON 请求体是一种常见的需求。在本文中,我们将介绍在 JavaScript 中实现这一需求的几种方法。   XMLHttpRequest 是一种传统的发送网络请求的方式。以下是一个使用 XMLHttpRequest 发送 POST 请

    2024年03月19日
    浏览(46)
  • vector容器删除元素的几种简单方法(详细实用)

    (1)使用 vector库函数“erase”删除 , 使用erase函数后容器size自动-1 (2)使用 vector库函数“swap和pop_back()\\\" ,由于 pop_back删除的是最后一个元素 ,所以先移位再删除 如果从数组的角度理解,因为数组存储的内容 在地址上是连续的 ,要移除目标元素,就没有库函数可以使用,

    2023年04月16日
    浏览(37)
  • 【移动开发小技巧】苹果修改手机位置最简单的几种方法整理

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月12日
    浏览(33)
  • django中实现事务的几种方式

    1.实现事务的三种方式 1.1 全局开启事务--- 全局开启事务,绑定的是http请求响应整个过程  1.2 一个视图函数在一个事物中 1.3 局部使用事务 保存点 在事务操作中,我们还会经常显式地设置保存点(savepoint) 一旦发生异常或错误,我们使用savepoint_rollback方法让程序回滚到指定的

    2024年02月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包