JS中一种实现sleep函数的方案

困扰了我很久的问题,在此留个记录
①原生js
②setInterval和setTimeout
③近似递归的处理方法

因为js是单线程,所以计时器也是有顺序的
//问题描述:我想实现一个网页的图片左右滑动效果(不是切换),
//要求:每次滑动一张图片,然后停止1s,再滑动……停止……
//解决思路:给图片滑动写一个方法,执行一次移动一小点距离,n次后移动完整张图片,使用setInterval函数去执行这个n次循环的操作;然后使用setTimeout函数去完成1s的等待。
//大概思想代码描述如下:
假设每一张图片宽度值为100
var n = 20;//次数统计
function animation(){
    n--;
    left = left-5;
    if(n == 0){
        n = 20;
        //满足条件就停止播放动画的计时器,从而达到‘阻塞’的效果
        window.clearInterval(timer);
        //设置超时计时器,延时1s执行
        window.setTimeout(function(){
            //清除运行中的计时器(没有则不管)
            window.clearInterval(timer);
            //设置动画的运行的计时器(此时超时计时器已经没有了)
            window.setInterval(animation,20);
        },1000);
    }
}
var timer = window.setInterval(animation,20);
//效果就是每20ms执行一次图片操作,执行20次之后就等待1000ms,不会因为js暂停之类的系统优化策略导致滑动位置错误
//延时操作是为了开启动画计时器

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值