注意:若你想在瀏覽器下次重繪之前繼續(xù)更新下一幀動畫函喉,那么回調(diào)函數(shù)自身必須再次調(diào)用
window.requestAnimationFrame()
requestAnimationFrame函數(shù)需要傳遞一個函數(shù)作為參數(shù)避归,會返回一個id作為唯一標(biāo)識,并且
該回調(diào)函數(shù)會被傳入
DOMHighResTimeStamp
參數(shù)管呵,該參數(shù)與performance.now()
的返回值相同梳毙,它表示requestAnimationFrame()
開始去執(zhí)行回調(diào)函數(shù)的時刻
所以我們做的事情就很簡單了,只需要在時間沒到達指定的時間的時候重復(fù)調(diào)用此函數(shù)捐下,想要清除的話只需要使用window.cancelAnimationFrame()
把得到的id傳遞進去即可
const timeout = (fn: () => void, delay: number): () => void => {
let timer: number;
const stime = +new Date();
const loop = () => {
const etime = +new Date();
if (stime + delay <= etime) {
fn();
return;
}
timer = requestAnimationFrame(loop);
};
timer = requestAnimationFrame(loop);
return () => {
console.log('觸發(fā)了取消');
cancelAnimationFrame(timer);
};
};