日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

js實現0ms延時定時器的幾種方式

瀏覽:190日期:2024-03-21 18:52:10
目錄queueMicrotaskasync/awaitMessageChannel最后附錄

這兩天看到一篇介紹《如何實現準時的 setTimeout?》的文章,文章起源于一道面試題:有什么辦法讓setTimeout準時呀?具體文章內容可查看附錄【1】,看完之后,引起了我對setTimeout這個函數的探究興趣,因此在MDN上重新查閱了相關文檔,其中提到【最小延時 >=4ms】的一點,因此使用setTimeout不能實現0ms延時的定時器,如果要實現的話,提供了一個參考鏈接【2】,作者的實現思路是通過postMessage來模擬,繞過setTimeout的限制,從而實現0ms延時的定時器,說簡單來講就是起了一個宏任務去執行回調,先具體看下是怎么實現的:

(function() { var timeouts = []; var messageName = 'zero-timeout-message'; // Like setTimeout, but only takes a function argument. There’s // no time argument (always zero) and no arguments (you have to use a closure) function setZeroTimeout(fn) { timeouts.push(fn); window.postMessage(messageName, '*'); } function handleMessage(event) { if (event.source == window && event.data == messageName) { event.stopPropagation(); if (timeouts.length > 0) { var fn = timeouts.shift(); fn(); } } } window.addEventListener('message', handleMessage, true); // Add the one thing we want added to the window object. window.setZeroTimeout = setZeroTimeout;})();

作者還提供了一個demo頁面【3】,通過于setTimeout(0)進行對比,在我瀏覽器的執行結果如下:

100 iterations of setZeroTimeout took 15 milliseconds.100 iterations of setTimeout(0) took 488 milliseconds.

根據結果對比來看,setZeroTimeout執行比setTimeout快了上百倍,這是一個巨大的提升。今天想討論的是除了上述這種方式,還可以通過哪些方式來實現一個0ms延時的定時器呢,首先,我們要確定一下我們自定義的定時器是異步的,其次是盡可能早的被執行。說起異步,js提供了好幾種解決方案,我們可以逐一去驗證。

在深入討論各種實現方式之前,約定提供的setTimeout對比版本如下,后面自定義實現的方案都將和setTimeout版本的執行時間進行對比,代碼比較簡單:

(function() { let i = 0; const start = Date.now(); function test() { if(i++ < 100) { setTimeout(test); } else { console.log(’setTimeout執行時間:’, Date.now() - start); } } setTimeout(test);})();queueMicrotask

queueMicrotask這個api可以添加一個微任務,使用比較簡單,直接傳遞一個回調函數即可,具體實現如下:

(function() { function setZeroTimeout(fn) { queueMicrotask(fn); } let i = 0; const start = Date.now(); function test() { if(i++ < 100) { setZeroTimeout(test); } else { console.log(’setZeroTimeout執行時間:’, Date.now() - start); } } setZeroTimeout(test);})();

通過和setTimeout版本進行對比,最終結果如下:

setZeroTimeout執行時間: 2setTimeout執行時間: 490

關于這個API的介紹在MDN上有詳細的說明,就不展開介紹了,這里多說一點,根據規范文檔的說明,大多數情況下,推薦使用requestAnimationFrame()和requestIdleCallback()等api,因為queueMicrotask會阻塞渲染,在很多時候都不是一種好的實踐。

async/await

async/await對于前端開發人員來說已經是必不可少的了,這里我們也可以用來實現:

(function() { async function setAsyncTimeout(fn) { Promise.resolve().then(fn); } let i = 0; const start = Date.now(); async function test() { if (i++ < 100) { await setAsyncTimeout(test); } else { console.log(’setAsyncTimeout執行時間:’, Date.now() - start); } } setAsyncTimeout(test);})();

通過和setTimeout版本進行對比,最終結果如下:

setAsyncTimeout執行時間: 2setTimeout執行時間: 490

如果不嫌麻煩,還可以通過Promise來實現,其實都是大同小異,無非多些點代碼,這里就省略了。

MessageChannel

MessageChannel允許我們創建一個新的消息通道,并通過它的兩個MessagePort屬性發送數據,MessageChannel提供端口的概念,實現端口之間的通信,比如worker/iframe之間的通信。

(function() { const channel = new MessageChannel(); function setMessageChannelTimeout(fn) { channel.port2.postMessage(null); } channel.port1.onmessage = function() { test(); }; let i = 0; const start = Date.now(); function test() { if(i++ < 100) { setMessageChannelTimeout(test); } else { console.log(’setMessageChannelTimeout執行時間:’, Date.now() - start); } } setMessageChannelTimeout(test);})();

通過和setTimeout版本進行對比,最終結果如下:

setMessageChannelTimeout執行時間: 4setTimeout執行時間: 490

第三種方式運行時間比前面兩種更長些,因為通過MessageChannel產生的是宏任務,其他兩種是微任務,微任務執行靠前,且會阻塞主線程,因此時間會長一點。

最后

本文提供了三種實現方式,都是圍繞js提供異步解決方案來實現的,實現本身并不復雜。

附錄

​​【1】https://mp.weixin.qq.com/s/QRIXBoKr2dMgLob3Atq9-g【2】https://dbaron.org/log/20100309-faster-timeouts【3】https://dbaron.org/mozilla/zero-timeout

到此這篇關于js實現0ms延時定時器的幾種方式的文章就介紹到這了,更多相關js 延時定時器 內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91亚洲自偷观看高清| 日本久久成人网| 久久国产福利| 国产综合亚洲精品一区二| 日本成人在线网站| 狠狠爱成人网| 久久九九精品| 国产精品久久久亚洲一区| 首页亚洲欧美制服丝腿| 亚洲深夜影院| 亚洲欧美专区| 国产精品任我爽爆在线播放| 久久一区视频| 91精品一区国产高清在线gif| 午夜精品网站| 日韩三级精品| 精品视频国产| 91精品国产调教在线观看| 激情久久中文字幕| 在线一区二区三区视频| 国产午夜久久av| 精品精品99| 97在线精品| 亚洲精品极品少妇16p| 亚洲伊人影院| 欧美a一区二区| 成人免费网站www网站高清| 日韩视频在线一区二区三区 | 日本三级亚洲精品| 欧美国产三级| 一区二区三区四区日本视频| 国产国产精品| 国产色99精品9i| 成人片免费看| 男人天堂欧美日韩| 麻豆精品久久久| 日韩精品2区| 石原莉奈在线亚洲三区| 国产精品亚洲欧美| 久久精品亚洲人成影院| 免费在线视频一区| 国产福利一区二区三区在线播放| 国产传媒在线| 午夜一级久久| 麻豆久久一区| 九一精品国产| 欧美日韩xxxx| 亚洲高清成人| 久久福利在线| 亚洲免费影视| 国产一区精品福利| av不卡免费看| 九九99久久精品在免费线bt| 99日韩精品| 欧美激情亚洲| 中文亚洲免费| 国精品产品一区| 在线国产精品一区| 精品欠久久久中文字幕加勒比| 亚洲精品小说| 精品久久97| 婷婷视频一区二区三区| 亚洲一级大片| 日韩免费看片| 日韩精品导航| 99精品在线观看| 国产精品xxxav免费视频| 亚洲深夜福利| 欧美三级精品| 国产欧美一区二区色老头| 不卡一区综合视频| 成人日韩av| 日韩精品免费视频人成| 日韩免费看片| 国产日韩中文在线中文字幕| 欧美在线影院| 91综合视频| 69堂精品视频在线播放| 欧美成人综合| 精品视频网站| 欧美天堂在线| 只有精品亚洲| 欧美天堂亚洲电影院在线观看| 国产一区调教| 国产乱码精品一区二区三区亚洲人| 亚洲欧洲日本mm| 成人精品动漫一区二区三区| 日韩不卡免费视频| 欧美中文字幕一区二区| 久久99影视| 日韩在线成人| 免费日韩精品中文字幕视频在线| 色婷婷久久久| 国产激情在线播放| 久久精品一区| 欧美啪啪一区| 日韩精品乱码av一区二区| 午夜久久影院| 欧美日中文字幕| 中文字幕成在线观看| 国产精品久久久久久久久免费高清| 亚洲午夜国产成人| 亚洲欧美日韩视频二区| 丝袜av一区| 日韩免费小视频| 综合日韩av| 国产不卡人人| 精品视频在线你懂得| 国产精品久久久久久久久久白浆 | 日韩精品一二三区| 婷婷激情综合| 久久国产日本精品| 日本高清不卡一区二区三区视频| 福利在线一区| 成人精品国产亚洲| 精品视频一区二区三区四区五区 | 国产一区日韩| 国产一区二区三区四区五区传媒| 嫩草伊人久久精品少妇av杨幂| 国产亚洲一区二区三区不卡| 91九色综合| 日韩午夜视频在线| 欧美有码在线| 国产精品日本一区二区不卡视频 | 亚洲三级国产| 少妇精品久久久| 91国内精品| 国产精品亚洲综合在线观看| 欧美日本久久| 国产精品jk白丝蜜臀av小说| 免费日韩一区二区三区| 另类欧美日韩国产在线| 久久丁香四色| www.51av欧美视频| 97se综合| 91精品国产成人观看| 五月婷婷亚洲| 99热免费精品| 日韩一区二区三区在线看| 日韩不卡一区二区三区 | 国产精品一区二区美女视频免费看| 国产精品theporn| 精品国产成人| 伊人精品一区| 国产视频一区在线观看一区免费| 日韩精品一级二级| 国产视频一区二| 国内精品亚洲| 极品日韩av| 蜜桃av一区二区在线观看| 日韩精品亚洲专区| 国产精品115| 日韩不卡视频在线观看| 伊人久久亚洲热| 日韩精品电影一区亚洲| 久久99久久人婷婷精品综合| 国产一区二区三区久久久久久久久| 久久电影tv| 国产一级久久| 欧美日韩一区二区国产| 成人亚洲精品| 亚洲一级特黄| 91精品尤物| 日韩不卡免费高清视频| 丝袜亚洲另类欧美 | 国产精品麻豆成人av电影艾秋| 91欧美在线| 男女激情视频一区| 国产黄色一区| 欧美成人精品| 国产日韩精品视频一区二区三区| 高清一区二区| 国产精品av一区二区| 亚洲精品欧美| 在线看片国产福利你懂的| 美女尤物久久精品| 国产一区丝袜| 亚洲色图综合| 92国产精品| 日韩高清一区| 91精品国产成人观看| 日本在线观看不卡视频| 日韩伦理福利| 97久久超碰| 亚洲国产不卡| 久久精品一本| 中文欧美日韩| 国产一区二区三区国产精品| 免费在线观看视频一区| 国产在线观看91一区二区三区| 午夜一级久久| 黄色精品视频| 日韩专区视频网站| 婷婷成人在线| 麻豆中文一区二区| 久久xxxx| 日韩av首页| 蜜桃久久久久| 亚洲精品国产精品粉嫩| 欧美69视频|