实现倒计时模块方法

2017-08-28  本文已影响15人  星月西

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.实现深度拷贝

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并不一定是准确的事件,可能会有以下情况:

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);
});
上一篇 下一篇

猜你喜欢

热点阅读