簡體   English   中英

如何在不使用 setTimeout 的情況下使用 setTimeout function

[英]How to use setTimeout without using setTimeout function

有沒有辦法在不使用setTimeout內置 function 的情況下使用setTimeout

我不想使用setIntervalclearIntervalwindow.use 我瀏覽了多個博客,但所有這些都使用windowsetIntervalclearInterval

例如,下面的代碼有效,但我不想擁有 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?

我在這里使用requestAnimationFrameperformance.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM