最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JavaScript sleep睡眠函数

    正文概述 掘金(进击的大羊)   2021-01-22   609

    1.sleep函数

    JavaScript是单线程运行的,没有内置的sleep函数,现在模拟实现sleep延迟执行的效果。
    使用睡眠函数实现红绿灯代码,红灯2秒,黄灯1秒,绿灯3秒,循环改变颜色。

    2. setTimeout

    直接使用setTimeout实现sleep()的方法,兼容性最好,但是使用了回调函数的实现方式,代码的可读性和维护性不是很好。

    // setTimeout
    let fun = () => console.log('time out');
    let sleep = function(fun,time){
      setTimeout(()=>{
        fun();
      },time);
    }
    
    sleep(fun,2000);
    

    setTimeout

    setTimeout是最基本的实现方式,代码如下,使用递归来实现循环改变颜色:

    function changeColor(color) {
    	console.log('traffic-light ', color);
    }
    function main() {
    	changeColor('red');
    	setTimeout(()=>{
    		changeColor('yellow');
    		setTimeout(() => {
    			changeColor('green');
    			setTimeout(main, 2000);
    		}, 1000);
    	}, 2000);
    }
    main();
    

    3.Promise

    在ES6的语法中,Promisesleep方法异步的实现一种方式,借助Promise方法可以优雅的构建sleep实现方法,避免了使用函数回调的使用方式。

    // promise
    let fun = () => console.log('time out');
    let sleep2= (time)=> new Promise((resolve)=>{
      setTimeout(resolve,time)
    })
    sleep2(2000).then(fun);
    

    Promise

    使用Promise,把下一次的颜色改变写在then里面,最后同样使用递归完成循环。 使用promise代替setTimeout,利用链式调用以及then来实现灯的转换,then返回一个promise对象,当这个对象为resolve状态then可以持续调用。

    const traffic_light=(color,duration)=>{
      return new Promise((resolve,reject)=>{
        console.log('traffic-light ', color);
        setTimeout(()=>{
            resolve()
        },duration)
      })
    }
    const main=()=>{
        Promise.resolve()
        .then(()=>{
            return traffic_light('red',3000)
        })
        .then(()=>{
            return traffic_light('yellow',1000)
        })
        .then(()=>{
            return traffic_light('green',2000)
        })
        .then(()=>{
            main();
        })
    }
    main()
    

    4. async await

    async await实际上是generatorpromise的语法糖,在提供同步编程方式实现异步调用的基础上,同时满足对sleep函数语义化的支持,也是常用的sleep的实现方式。

    // async await
    async function wait(time){
      await sleep2(time);
      fun();
    }
    
    wait(3000);
    

    async await 使用

    使用async await就可以避免Promise的一连串.then.then.then,也不再需要递归,使用while(true)就可以实现循环。

    function sleep(duration) {
      return new Promise(resolve => {
          setTimeout(resolve, duration);
      })
    }
    async function changeColor(color, duration) {
    	console.log('traffic-light ', color);
    	await sleep(duration);
    }
    async function main() {
    	while (true) {
    		await changeColor('red', 2000);
    		await changeColor('yellow', 1000);
    		await changeColor('green', 3000);
    	}
    }
    main();
    

    参考文章:

    • 红绿灯
    • 红绿灯

    起源地下载网 » JavaScript sleep睡眠函数

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元