使用setInterval
而沒有使用while(true)
主要還是爲了練習Promise
和 async/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是不準的了。這跟瀏覽器的事件循環機制有關係(挖了一個坑)。