实现倒计时模块方法

1.实现思路

  • 参数验证
  • 二分法实现补充
  • 奇数除以二都为偶数
function leftpad(str, len, ch) {
    str = String(str);
    len = len - str.length;
    if (len <= 0) {
        return str;
    }
    if (!ch && ch !== 0) {
        ch = ' ';
    }
    ch = String(ch);

    var pad = '';
    while (true) {
        if (len & 1) {
            pad += ch;
        }
        len >>= 1;
        if (len) {
            ch += ch;
        } else {
            break;
        }
    }
    return pad + str;
}

2.实现深度拷贝

  • 关键点为需要考虑到数组和null这两个特殊的对象
  • 如果直接使用JSON.parse(JSON.stringify(obj)),则无法拷贝对象中的函数
function copy(obj){
    if(typeof obj !== 'object' || obj===null){
        return obj;
    }

    var res=Array.isArray(obj)?[]:{};
    for(var i in obj){
        res[i]=copy(obj[i]);
    }
    return res;
}

3.深入理解setInterval

设置setInterval定时器后,当要向任务队列里添加代码实例时,如果任务队列里面已经存在代码实例,则不会添加,这就会导致setInterval并不一定是准确的事件,可能会有以下情况:

  • 定时任务设置2s,任务队列被阻塞了,上一个任务延后1s执行,那么任务间隔缩短到了1s
  • 定时任务设置2s,任务队列被阻塞了,上一个任务还没完成,下一个任务不会添加,直接跳过了
setInterval(()=>console.log('red'),1000);

//定时函数
function sleep(time){
    var now=Date.now();
    while(true){
        var t=Date.now();
        if(t-now>=time){
            break;
        }
    }
}

sleep(5000);

而递归调用setTimeout则可以执行完上一个任务后,再过1s执行下一个任务,保证任务间隔会大于等于1s

4.获取服务器时间的方法

可以通过ajax获取服务器响应,从响应头部中的Date拿到服务器时间

function getNowTime(callback){
    var xhr=new XMLHttpRequest();
    xhr.onreadystatechange=function(){
        if(xhr.readyState===3){
            var now=xhr.getResponseHeader('Date');
            callback(now);
            xhr.abort();
        }
    }
    xhr.open('get','/',true);
    xhr.send(null);
}

getNowTime((now)=>{
    console.log(now);
});
  • 客户端无法获取响应中的Set-Cookie,Set-Cookie2这两个字段,无论是同域还是跨域请求
  • 对于跨域请求,客户端可以获取的字段只有与缓存和主体类型相关的字段,和Access-Control-Expose-Headers中规定的字段

你可能感兴趣的:(实现倒计时模块方法)