[英]How to use setTimeout without using setTimeout function
有沒有辦法在不使用setTimeout
內置 function 的情況下使用setTimeout
?
我不想使用setInterval
或clearInterval
或window.use
。 我瀏覽了多個博客,但所有這些都使用window
、 setInterval
或clearInterval
。
例如,下面的代碼有效,但我不想擁有 window。
const setTimeouts = [];
function customSetTimeout(cb, interval) {
const now = window.performance.now();
const index = setTimeouts.length;
setTimeouts[index] = () => {
cb();
};
setTimeouts[index].active = true;
const handleMessage = (evt) => {
if (evt.data === index) {
if (window.performance.now() - now >= interval) {
window.removeEventListener('message', handleMessage);
if (setTimeouts[index].active) {
setTimeouts[index]();
}
} else {
window.postMessage(index, '*');
}
}
};
window.addEventListener('message', handleMessage);
window.postMessage(index, '*');
return index;
}
const setIntervals = [];
function customSetInterval(cb, interval) {
const intervalId = setIntervals.length;
setIntervals[intervalId] = function () {
if (setIntervals[intervalId].active) {
cb();
customSetTimeout(setIntervals[intervalId], interval);
}
};
setIntervals[intervalId].active = true;
customSetTimeout(setIntervals[intervalId], interval);
return intervalId;
}
function customClearInterval(intervalId) {
if (setIntervals[intervalId]) {
setIntervals[intervalId].active = false;
}
}
console.log("1");
customSetTimeout(function() {
console.log('3s');
}, 3000);
console.log("2");
========================================
替代解決方案:但是在這里,我又不想使用 clearInterval 和 setInterval
var setMyTimeOut = function(foo,timeOut){
console.log('inside time out');
var timer;
var currentTime = new Date().getTime();
var blah=()=>{
if (new Date().getTime() >= currentTime + timeOut) {
console.log('clear interval if');
clearInterval(timer);
foo()
}
console.log('clear interval else');
}
timer= setInterval(blah, 100);
}
console.log("1");
setMyTimeOut(function() {
console.log('3s');
}, 3000);
console.log("2");
有沒有辦法實現相同但不使用 setInterval 和 clearInterval?
我在這里使用requestAnimationFrame
和performance.now()
。
它不是非常精確(setTimeout 也不是),但它確實有效。
function sleep(delay, cb) { function check(time, delay) { if(time >= delay) { cb("done"); return; } time = performance.now(); requestAnimationFrame(check.bind(null, time,delay)) } check(performance.now(), delay + performance.now()); } sleep(4000, ()=> { console.log("sleep done"); }) console.log("i do not block the main thread");
您可以使用while
循環來檢查設置的時間與當前時間:
const startTime = new Date().getTime() + 3000; let currentTime = new Date().getTime(); function customTimeout() { while (startTime > currentTime) { currentTime = new Date().getTime(); } return console.log('3 Seconds') }; customTimeout();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.