精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何讓定時器在頁面最小化的時候不執(zhí)行?

開發(fā) 前端
setTimeout 和 setInterval 作為事件循環(huán)中宏任務(wù)的“兩大主力”,它的執(zhí)行時機不能跟我們預(yù)期一樣準(zhǔn)確的,它需要等待前面任務(wù)的執(zhí)行。

注:本系列對 ahooks 的源碼解析是基于 v3.3.13。自己 folk 了一份源碼,主要是對源碼做了一些解讀,可見 詳情[1]。

今天我們來聊聊定時器。

useInterval 和 useTimeout

看名稱,我們就能大概知道,它們的功能對應(yīng)的是 setInterval 和 setTimeout,那對比后者有什么優(yōu)勢?

先看 useInterval,代碼簡單,如下所示:

function useInterval(
fn: () => void,
delay: number | undefined,
options?: {
immediate?: boolean;
},
) {
const immediate = options?.immediate;
const fnRef = useLatest(fn);
useEffect(() => {
// 忽略部分代碼...
// 立即執(zhí)行
if (immediate) {
fnRef.current();
}
const timer = setInterval(() => {
fnRef.current();
}, delay);
// 清除定時器
return () => {
clearInterval(timer);
};
// 動態(tài)修改 delay 以實現(xiàn)定時器間隔變化與暫停。
}, [delay]);
}

跟 setInterval 的區(qū)別如下:

  • 可以支持第三個參數(shù),通過 immediate 能夠立即執(zhí)行我們的定時器。
  • 在變更 delay 的時候,會自動清除舊的定時器,并同時啟動新的定時器。
  • 通過 useEffect 的返回清除機制,開發(fā)者不需要關(guān)注清除定時器的邏輯,避免內(nèi)存泄露問題。這點是很多開發(fā)者會忽略的點。

useTimeout 跟上面很類似,如下所示,不再做額外解釋:

function useTimeout(fn: () => void, delay: number | undefined): void {
const fnRef = useLatest(fn);

useEffect(() => {
// ...忽略部分代碼
const timer = setTimeout(() => {
fnRef.current();
}, delay);
return () => {
clearTimeout(timer);
};
// 動態(tài)修改 delay 以實現(xiàn)定時器間隔變化與暫停。
}, [delay]);
}

setTimeout 和 setInterval 的問題

首先,setTimeout 和 setInterval 作為事件循環(huán)中宏任務(wù)的“兩大主力”,它的執(zhí)行時機不能跟我們預(yù)期一樣準(zhǔn)確的,它需要等待前面任務(wù)的執(zhí)行。比如下面的 setTimeout 的第二個參數(shù)設(shè)置為 0,并不會立即執(zhí)行。

setTimeout(() => {
console.log('test');
}, 0)

另外還有一種情況,setTimeout 和 setInterval 在瀏覽器不可見的時候(比如最小化的時候),不同的瀏覽器中設(shè)置不同的時間間隔的時候,其表現(xiàn)不一樣。根據(jù) 當(dāng)瀏覽器切換到其他標(biāo)簽頁或者最小化時,你的js定時器還準(zhǔn)時嗎?[2] 這篇文章的實踐結(jié)論如下:

谷歌瀏覽器中,當(dāng)頁面處于不可見狀態(tài)時,setInterval 的最小間隔時間會被限制為 1s。火狐瀏覽器的 setInterval 和谷歌特性一致,但是 ie 瀏覽器沒有對不可見狀態(tài)時的 setInterval 進行性能優(yōu)化,不可見前后間隔時間不變。

在谷歌瀏覽器中,setTimeout在瀏覽器不可見狀態(tài)下間隔低于1s的會變?yōu)?s,大于等于1s的會變成N+1s的間隔值。火狐瀏覽器下setTimeout的最小間隔時間會變?yōu)?s,大于等于1s的間隔不變。ie瀏覽器在不可見狀態(tài)前后的間隔時間不變。

這個結(jié)論,我沒有驗證過,但看起來差異挺大,其中還提到了另外一個選擇,就是 requestAnimationFrame。

window.requestAnimationFrame() 告訴瀏覽器——你希望執(zhí)行一個動畫,并且要求瀏覽器在下次重繪之前調(diào)用指定的回調(diào)函數(shù)更新動畫。該方法需要傳入一個回調(diào)函數(shù)作為參數(shù),該回調(diào)函數(shù)會在瀏覽器下一次重繪之前執(zhí)行

為了提高性能和電池壽命,因此在大多數(shù)瀏覽器里,當(dāng)requestAnimationFrame() 運行在后臺標(biāo)簽頁或者隱藏的 <iframe> 里時,requestAnimationFrame() 會被暫停調(diào)用以提升性能和電池壽命。

所以,ahooks 也提供了使用 requestAnimationFrame 進行模擬定時器處理的 hook,我們一起來看下。

useRafInterval 和 useRafTimeout

直接看 useRafInterval。(useRafTimeout 和 useRafInterval 類似,這里不展開細(xì)說)。

function useRafInterval(
fn: () => void,
delay: number | undefined,
options?: {
immediate?: boolean;
},
) {
const immediate = options?.immediate;
const fnRef = useLatest(fn);

useEffect(() => {
// 省略部分代碼...
const timer = setRafInterval(() => {
fnRef.current();
}, delay);
return () => {
clearRafInterval(timer);
};
}, [delay]);
}

可以看到,跟前面的 useInterval 大部分代碼邏輯都是一樣的,只是定時使用了 setRafInterval? 方法,清除定時器用了 clearRafInterval。

setRafInterval

直接上代碼:

const setRafInterval = function (callback: () => void, delay: number = 0): Handle {
if (typeof requestAnimationFrame === typeof undefined) {
// 如果不支持,還是使用 setInterval
return {
id: setInterval(callback, delay),
};
}
// 開始時間
let start = new Date().getTime();
const handle: Handle = {
id: 0,
};
const loop = () => {
const current = new Date().getTime();
// 當(dāng)前時間 - 開始時間,大于設(shè)置的間隔,則執(zhí)行,并重置開始時間
if (current - start >= delay) {
callback();
start = new Date().getTime();
}
handle.id = requestAnimationFrame(loop);
};
handle.id = requestAnimationFrame(loop);
return handle;
};

首先是用 typeof 判斷進行兼容邏輯處理,假如不兼容,則兜底使用 setInterval。

初始記錄一個 start 的時間。

在 requestAnimationFrame 回調(diào)中,判斷現(xiàn)在的時間減去開始時間有沒有達(dá)到間隔,假如達(dá)到則執(zhí)行我們的 callback 函數(shù)。更新開始時間。

clearRafInterval

清除定時器。

function cancelAnimationFrameIsNotDefined(t: any): t is NodeJS.Timer {
return typeof cancelAnimationFrame === typeof undefined;
}
// 清除定時器
const clearRafInterval = function (handle: Handle) {
if (cancelAnimationFrameIsNotDefined(handle.id)) {
return clearInterval(handle.id);
}
cancelAnimationFrame(handle.id);
};

假如不支持 cancelAnimationFrame API,則通過 clearInterval 清除,支持則直接使用 cancelAnimationFrame 清除。

思考與總結(jié)

關(guān)于定時器,我們平時用得不少,但經(jīng)常有同學(xué)容易忘記清除定時器,結(jié)合 useEffect 返回清除副作用函數(shù)這個特性,我們可以將這類邏輯一起封裝到 hook 中,讓開發(fā)者使用更加方便。

另外,假如希望在頁面不可見的時候,不執(zhí)行定時器,可以選擇 useRafInterval 和 useRafTimeout,其內(nèi)部是使用 requestAnimationFrame 進行實現(xiàn)。

參考資料

[1]詳情: https://github.com/GpingFeng/hooks。

[2]當(dāng)瀏覽器切換到其他標(biāo)簽頁或者最小化時,你的js定時器還準(zhǔn)時嗎?: https://juejin.cn/post/6899796711401586695#comment。

責(zé)任編輯:姜華 來源: 前端雜貨鋪
相關(guān)推薦

2021-04-13 16:00:54

加密貨幣數(shù)據(jù)貨幣

2013-05-31 09:26:11

云宕機SLA云應(yīng)用彈性

2023-01-10 13:53:21

Linux定時器

2022-03-28 17:10:18

樹莓派服務(wù)器舊硬件

2015-09-18 09:23:34

云APIAPI升級云服務(wù)中斷

2022-06-01 08:00:00

開發(fā)成本功能

2010-07-28 15:56:22

FlexTimer定時

2009-11-11 10:14:10

linux定時器操作系統(tǒng)

2015-10-29 10:09:57

混合云影子IT SaaS

2018-11-02 08:10:58

Linuxsystemd定時器

2009-08-14 10:35:25

C#最小化編寫

2009-07-02 17:59:51

2022-11-02 11:40:16

Flowable定時器流程

2023-10-18 11:01:07

GNOME按鈕

2011-04-13 11:11:36

VC++托盤程序

2011-10-31 10:21:05

2021-08-03 14:33:53

cron定時器Linux命令

2021-06-28 06:00:11

systemd定時器系統(tǒng)運維

2010-03-17 12:37:51

Python定時器

2011-01-19 14:40:45

Thunderbird
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲欧洲午夜一线一品| 一区二区三区小说| 国产精品一区二区久久久| 自拍偷拍第9页| 玖玖精品一区| 欧美日韩精品在线视频| 亚洲成色www久久网站| 国产精品-色哟哟| 亚洲日本黄色| 日韩在线观看网址| chinese麻豆新拍video| 欧美日一区二区三区| 亚洲午夜日本在线观看| 亚洲视频电影| 视频午夜在线| 国产一区二区三区在线观看免费| 亚洲无线一线二线三线区别av| 色综合天天做天天爱| 伊人久久99| 伊人久久大香线蕉午夜av| 制服.丝袜.亚洲.中文.综合懂色| 欧美午夜精彩| 亚洲第一精品夜夜躁人人躁| 国产精品区在线| 激情国产在线| 亚洲精品国产第一综合99久久| 欧美h视频在线| 亚洲国产精品久久久久爰性色| 日韩国产欧美三级| 午夜精品久久久久久久99热| 无码人妻精品一区二区三区夜夜嗨 | 99久久伊人网影院| 亚洲一区二区三区久久| 国产精品51麻豆cm传媒 | 国产绳艺sm调教室论坛| 久久蜜桃精品| 97国产精品人人爽人人做| 欧美第一页在线观看| 欧美中文一区二区| 亚洲人成电影网站色| 免费a v网站| 网站一区二区| 91精品国产福利在线观看| 亚洲精品视频导航| 欧美xoxoxo| 色国产精品一区在线观看| 青青青青草视频| 国产在线拍揄自揄拍视频 | 免费看啪啪网站| 国产黄色片在线播放| 久久天堂av综合合色蜜桃网| 久久99精品久久久久久水蜜桃| www.黄色小说.com| 国产精品一区在线观看你懂的| 国产精品亚洲欧美导航| 最近中文在线观看| 麻豆视频在线看| 综合网在线视频| 亚洲图色在线| 在线中文资源天堂| 综合色天天鬼久久鬼色| 中文字幕av日韩精品| 国产美女在线观看| 亚洲免费观看在线视频| 老司机激情视频| 在线观看操人| 亚洲高清免费一级二级三级| 日韩网站在线免费观看| 国产中文在线播放| 欧美日韩另类视频| 免费黄色特级片| 99re66热这里只有精品4| 欧美日韩中文国产| 在线免费黄色网| 99精品中文字幕在线不卡| 精品捆绑美女sm三区| 国产精品九九视频| 免费观看不卡av| 色噜噜狠狠色综合网图区| 精品国产大片大片大片| 午夜久久99| 91精品国产91久久久久福利| 秋霞av一区二区三区| 免费高清成人在线| 91亚色免费| 网站黄在线观看| 久久久精品蜜桃| 免费观看黄色大片| 麻豆免费版在线观看| 精品视频一区三区九区| 日本中文字幕有码| 日韩激情毛片| 久久久精品网站| 欧美三日本三级少妇99| 日本午夜精品一区二区三区电影| 51国产成人精品午夜福中文下载| 三级网站在线看| 日本一区二区高清| 国产小视频免费| 日韩福利一区| 欧美大片国产精品| 亚洲黄色免费视频| 国产成人无码专区| 激情文学一区| 国产精品久久久久秋霞鲁丝| www.黄色一片| 欧美国产一区视频在线观看| 国产 欧美 日本| 亚洲va中文在线播放免费| 51精品秘密在线观看| 国产麻豆天美果冻无码视频 | 国产精品一区在线| 欧美日韩亚洲免费| 日本片在线看| 欧美亚洲日本一区| 国产成人精品无码片区在线| 午夜片欧美伦| 日本高清+成人网在线观看| 国产熟女一区二区丰满| 国产欧美综合色| 亚洲午夜精品久久久久久人妖| 精品视频在线播放一区二区三区| 国产偷国产偷亚洲清高网站| 精品少妇久久久| 黄一区二区三区| 日韩精品久久一区二区三区| 国产网站在线| 日韩欧美二区三区| 四虎影视一区二区| 久久久久久穴| 久久综合狠狠综合久久综青草| 天堂av中文在线| 欧美猛男gaygay网站| a天堂中文字幕| 99热精品在线| 国产免费一区二区三区| 18视频在线观看网站| 欧美精品v国产精品v日韩精品 | 亚洲欧美二区三区| 五月婷婷狠狠操| 国产成人精品免费视| 97人洗澡人人免费公开视频碰碰碰| 午夜精品久久久久久久91蜜桃| 国产精品久久久久久久第一福利| 热久久精品国产| 亚洲最好看的视频| 性欧美xxxx视频在线观看| 懂色av蜜臀av粉嫩av分享吧| 亚洲人成小说网站色在线 | 老熟妇一区二区三区| 95精品视频在线| 欧美激情 国产精品| 国产成人福利av| 久久青草福利网站| 色呦呦免费观看| 亚洲成人中文在线| 欧美大片免费播放器| 亚欧成人精品| 天堂精品视频| 亚洲成人1区| 久热在线中文字幕色999舞| 国产精品国产三级国产aⅴ| 亚洲视频在线观看一区| 久久无码人妻一区二区三区| 中文字幕免费精品| 成人免费视频网站入口| av资源一区| 亚洲美女激情视频| 中文字幕乱码在线观看| 中文字幕一区二区视频| 亚洲女人在线观看| 亚洲国产免费看| 精品在线观看一区二区| 朝桐光一区二区| 久久久国产一区二区| wwwxxxx国产| 婷婷久久综合九色综合绿巨人 | 色综合综合网| 国产精品日韩欧美| 菠萝蜜视频国产在线播放| 亚洲精品在线电影| 国产成人无码专区| 亚洲婷婷国产精品电影人久久| 色哟哟网站在线观看| 亚洲欧美日韩国产一区二区| 日韩精品成人一区二区在线观看| 国产aⅴ精品一区二区四区| 久久久久久久久久久av| 免费a级毛片在线观看| 7777精品伊人久久久大香线蕉超级流畅 | 国产高清亚洲一区| 人体内射精一区二区三区 | 一本一生久久a久久精品综合蜜| 精品视频在线播放一区二区三区| 97精品视频在线播放| av电影在线观看一区二区三区| 日韩欧美一区二区不卡| 日韩特级黄色片| 亚洲图片你懂的| 欲求不满的岳中文字幕| 蜜桃一区二区三区在线观看| 日韩精品一区二区三区四| 久久99免费视频| 成人午夜电影在线播放| 日韩av首页| 91av在线影院| 在线网址91| 伊人久久五月天| 午夜成人鲁丝片午夜精品| 欧美人动与zoxxxx乱| 国产精品久久久久久久久久精爆| 亚洲婷婷在线视频| av男人的天堂av| 成+人+亚洲+综合天堂| 久热在线视频观看| 久久精品毛片| 又粗又黑又大的吊av| 影视亚洲一区二区三区| 日韩午夜视频在线观看| 黑色丝袜福利片av久久| 亚洲va欧美va国产综合久久| 色豆豆成人网| 欧美一级大片在线观看| 福利小视频在线| www.亚洲成人| 99中文字幕一区| 亚洲欧美日韩综合| 人成网站在线观看| 日韩欧美成人激情| 国产精品久久免费| 欧美日韩亚洲高清一区二区| 欧美亚洲精品天堂| 午夜精品aaa| 日本少妇久久久| 一区二区三区在线观看欧美| 日韩av手机在线免费观看| 中文字幕巨乱亚洲| 免费一级特黄3大片视频| 久久久久久久久岛国免费| 欧美一区二区免费在线观看| 成人妖精视频yjsp地址| 丰满饥渴老女人hd| 国产一区二区精品在线观看| 成人综合久久网| 麻豆精品视频在线观看免费| 色悠悠久久综合网| 美腿丝袜在线亚洲一区| 99视频在线视频| 日本不卡视频在线观看| 天天操天天爽天天射| 日本不卡一区二区三区| 91欧美视频在线| 九一九一国产精品| 涩多多在线观看| 国产成人av电影在线观看| 国产在线视频三区| 国产精品12区| 最新版天堂资源在线| 成人av综合一区| 中文字幕在线播放视频| 久久综合国产精品| 欧美大波大乳巨大乳| 欧美极品aⅴ影院| 少妇视频一区二区| 亚洲精选一二三| 国产精品99无码一区二区| 午夜精品视频一区| 国产区一区二区三| 欧美丝袜第三区| 国产美女无遮挡永久免费| 日韩精品资源二区在线| 熟妇高潮一区二区三区| 亚洲天堂成人在线| av网站在线免费观看| 久久久精品久久久| hd国产人妖ts另类视频| 欧洲美女7788成人免费视频| 久久国产三级| 超碰97国产在线| 蜜桃精品wwwmitaows| 麻豆中文字幕在线观看| 亚洲午夜av| 浓精h攵女乱爱av| 国产乱码一区二区三区| 一区二区三区少妇| 国产精品麻豆视频| 美女视频黄免费| 欧美日韩中文字幕在线视频| 中文字幕一区二区三区四区视频 | 欧美激情第一区| av高清久久久| 5566中文字幕| 精品二区三区线观看| 最近中文字幕在线观看视频| 日韩精品中文字幕在线不卡尤物| 你懂的在线观看视频网站| 久久九九热免费视频| 韩国成人漫画| 99re资源| 日本免费观看视| 亚洲成a人在线观看| 在线观看不卡的av| 亚洲国产高清福利视频| 欧美激情免费| 26uuu日韩精品一区二区| 男人亚洲天堂| 欧美18视频| 亚洲调教视频在线观看| 成人日韩在线视频| 99国产精品国产精品毛片| 无码黑人精品一区二区| 欧洲亚洲国产日韩| 天堂影院在线| 九九九久久久久久| 日本一区二区中文字幕| 欧美激情专区| 激情综合激情| 一级淫片在线观看| 中文字幕二三区不卡| 国产www在线| 亚洲福利在线播放| 在线中文字幕电影| 成人a免费视频| 清纯唯美日韩| 无码内射中文字幕岛国片| 国产精品亚洲第一| 99久久99久久精品国产| 欧美三级欧美一级| 成人在线观看一区| 热99精品只有里视频精品| 欧美色资源站| 免费不卡av在线| 粉嫩av一区二区三区在线播放| 国产麻豆a毛片| 欧美理论片在线| 91ph在线| 国产精品久久久久久久久久| 亚洲桃色综合影院| 亚洲国产精品久久久久爰色欲| 成人网在线播放| 欧美成人精品激情在线视频| 在线电影院国产精品| 91福利在线视频| 91精品国产综合久久香蕉922| 日韩免费在线| 午夜两性免费视频| 欧美激情一区在线| 中文字幕在线播放不卡| 中文字幕亚洲激情| 成人在线免费电影网站| 亚洲欧美日韩国产成人综合一二三区| 日本vs亚洲vs韩国一区三区二区 | 97福利一区二区| 精品在线网站观看| 国产原创中文在线观看| 97se狠狠狠综合亚洲狠狠| 国产又大又黄又粗| 亚洲男人天天操| 少妇精品视频一区二区免费看| 日韩欧美亚洲在线| 老司机精品视频一区二区三区| 天天看天天摸天天操| 欧美一区二区精美| 欧美人体视频xxxxx| 国产中文一区二区| 欧美中文字幕| 久草手机视频在线观看| 欧美一区二区在线视频| 欧美草逼视频| 久久久久网址| 奇米一区二区三区| 欧美色图亚洲天堂| 日韩精品免费在线观看| 91精品影视| 老司机午夜网站| 97精品久久久久中文字幕| 激情网站在线观看| 欧美精品一区在线播放| 亚洲第一福利专区| 九色porny自拍| 亚洲一二三区在线观看| 你懂得网站在线| 亚洲影视中文字幕| 国产亚洲激情| 疯狂撞击丝袜人妻| 亚洲福利影片在线| 久久久加勒比| 国产3p露脸普通话对白| 国产欧美日韩另类视频免费观看 | 精品小视频在线| 日韩伦理福利| 一区二区三区精品国产| 国产69精品久久久久777| 日本a级c片免费看三区| 久久精品国产欧美激情| 欧美日韩夜夜| 国产999免费视频| 日韩欧美精品免费在线| h片在线播放| 青青草久久网络|