JavaScript通過Promise實現sleep方法

使用setInterval 而沒有使用while(true) 主要還是爲了練習Promiseasync/await 的使用

(async function(){
    /**
    * s 休眠時長, 單位:秒
    */
    function sleep(s){
        s = s || 0;
        s  = parseInt(s) * 1000;
        let now = +new Date();
        let timer = null;
        return new Promise((resolve, reject)=>{
            timer = setInterval(()=>{
                if( now + s < +new Date()){
                    clearInterval(timer);
                    resolve(true);
                }
            }, 10)
        })

    }


console.log(`start: ${new Date()}`);
await sleep(3); // 休眠3秒
console.log(`end  : ${new Date()}`);

})()

PS:因爲是通過setInterval輪詢,而任何通過輪詢進行處理的問題,都會可能產生誤差。

而實際上JS中setTimeout/setInterval的實現機制就存在誤差, 請看下面的例子:

    let start = new Date();
    console.log(`start: ${start}`);
    setTimeout(()=>{
        console.log('This line will be log in 3 seconds?');
        console.log(`end  : ${new Date()}`);
    }
    , 3000);

    while (true) {

        if ((+start + 5000) < +new Date()) {
            return;
        }
    }

上面這段代碼中setTimeout並不是在3秒後執行的,如果理解了這句話,就知道爲什麼setTimeout是不準的了。這跟瀏覽器的事件循環機制有關係(挖了一個坑)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章