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

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

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

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

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

(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)進行對比,在我瀏覽器的執(zhí)行結果如下:

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

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

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

(function() { let i = 0; const start = Date.now(); function test() { if(i++ < 100) { setTimeout(test); } else { console.log(’setTimeout執(zhí)行時間:’, 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執(zhí)行時間:’, Date.now() - start); } } setZeroTimeout(test);})();

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

setZeroTimeout執(zhí)行時間: 2setTimeout執(zhí)行時間: 490

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

async/await

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

(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執(zhí)行時間:’, Date.now() - start); } } setAsyncTimeout(test);})();

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

setAsyncTimeout執(zhí)行時間: 2setTimeout執(zhí)行時間: 490

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

MessageChannel

MessageChannel允許我們創(chuàng)建一個新的消息通道,并通過它的兩個MessagePort屬性發(fā)送數據,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執(zhí)行時間:’, Date.now() - start); } } setMessageChannelTimeout(test);})();

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

setMessageChannelTimeout執(zhí)行時間: 4setTimeout執(zhí)行時間: 490

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

最后

本文提供了三種實現方式,都是圍繞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 延時定時器 內容請搜索好吧啦網以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲2区在线| 日韩欧美二区| 欧美午夜不卡影院在线观看完整版免费| jizzjizz中国精品麻豆| 欧美国产三级| 国产精品久久久一区二区| 欧美日韩一区二区三区不卡视频| 日韩国产欧美在线播放| 国产手机视频一区二区| 亚洲精品网址| 亚洲专区在线| 久久高清免费观看| 一区二区三区国产盗摄| 亚洲精品极品| 欧美国产一级| 999久久久国产精品| 亚洲精品高潮| 日韩av一区二区三区四区| 欧美日韩18| 欧美精品91| а√天堂8资源在线| 精品国产aⅴ| 视频一区欧美日韩| 在线观看亚洲精品福利片| 黄色av一区| 一区二区三区网站| 国产欧美日韩精品一区二区免费| 麻豆精品久久久| 久久亚洲国产精品尤物| 中文一区一区三区高中清不卡免费| 韩国久久久久久| 久久高清免费| 一区二区精彩视频| 欧美日本二区| 黑人精品一区| 国产亚洲一级| 日本午夜精品一区二区三区电影| 国产欧美亚洲精品a| 国产色播av在线| 日韩精品欧美| 亚洲区第一页| 国产成人免费视频网站视频社区| 久久精品免费一区二区三区| 午夜精品网站| 青青国产精品| 日韩福利一区| 蜜臀va亚洲va欧美va天堂| 97久久亚洲| 精品一区二区男人吃奶 | 国产成人免费| 国产一区调教| 亚洲精品中文字幕乱码| 日本亚洲视频在线| 国产精品久久久久久久免费观看 | 欧美精品羞羞答答| 日本欧美一区二区在线观看| jizzjizz中国精品麻豆| 久久亚洲影院| 国产白浆在线免费观看| 免费看黄色91| 国产精品115| 欧美日韩视频| 精品国产一区二区三区2021| 久久久噜噜噜| 91精品视频一区二区| 成人羞羞视频播放网站| 日韩欧美另类中文字幕| 日韩高清不卡| 欧美精品观看| 一区在线视频观看| 精品久久不卡| 爽好多水快深点欧美视频| 福利视频一区| 日本一区二区三区中文字幕| 免费一二一二在线视频| 免费看的黄色欧美网站| 久久精品五月| 中文字幕中文字幕精品| 日本美女一区| 国产精品v亚洲精品v日韩精品| 欧美日韩中文一区二区| 久久精品国产网站| 亚洲综合婷婷| 亚洲午夜视频| 国产a亚洲精品| 日韩一区精品| 黄色亚洲大片免费在线观看| 国产成人精选| 欧美视频一区| 亚洲最新av| 久久精选视频| 高清一区二区| 国产日韩免费| 亚洲色图国产| 国产一级一区二区| 亚洲爱爱视频| 国产aⅴ精品一区二区三区久久| 日韩三区四区| 水蜜桃久久夜色精品一区的特点| 欧美日韩一二| 久久久噜噜噜| 欧美天堂视频| 狠狠躁少妇一区二区三区| 麻豆视频观看网址久久| 欧美亚洲色图校园春色| 久久高清国产| 国产精品视区| 午夜日韩福利| 激情久久久久久久| 久久蜜桃精品| 少妇精品导航| 亚洲性色av| 亚洲www免费| 热三久草你在线| 成人一区不卡| 9999国产精品| 国内精品伊人| 国产91在线播放精品| 精品国产乱码久久久| 国产经典一区| 国产精品网址| 免费亚洲一区| 国产极品嫩模在线观看91精品| 欧美伊人久久| 日韩av在线免费观看不卡| 亚洲精品免费观看| 亚洲色图综合| 日本亚洲视频在线| 日韩久久一区| 日本亚洲不卡| 国产亚洲精品美女久久久久久久久久| 日韩二区三区四区| 久久国产三级精品| 国产精品白浆| 国内精品伊人| 欧美激情国产在线| 久久久国产精品一区二区中文| 日产精品一区| 国产一区欧美| 国产精品嫩草99av在线| 蜜臀久久久久久久| 日韩精品三区四区| 国产精品尤物| 国产精品久久久久久久久久10秀| 伊人久久国产| 不卡av一区二区| 老鸭窝亚洲一区二区三区| 中文字幕日韩高清在线| 日韩激情网站| 麻豆国产一区| 日本免费久久| 国产精品日韩| 欧美在线看片| 欧美男人天堂| 蜜桃伊人久久| 国产精品一区二区精品| 成人黄色av| 欧美日韩国产一区二区三区不卡| 性色一区二区| 久久国内精品自在自线400部| 麻豆国产欧美一区二区三区| 国产美女高潮在线| 在线视频亚洲| 国产伦精品一区二区三区在线播放| 久久精品国产精品亚洲毛片| av高清不卡| jiujiure精品视频播放| 日韩一二三区在线观看| 国产一区二区三区久久久久久久久| 色婷婷久久久| 亚洲婷婷丁香| 免费久久99精品国产| 欧美a一区二区| 久久久精品国产**网站| 鲁鲁在线中文| 免费看欧美美女黄的网站| 九色精品91| 日韩精品一区二区三区av | 免费视频一区二区| 青草国产精品| 亚洲不卡视频| 天堂网av成人| 国产aa精品| 香蕉成人av| 9色国产精品| 91亚洲精品在看在线观看高清| 亚洲精品乱码久久久久久蜜桃麻豆 | 丰满少妇一区| 国产精品观看| 国产精品天天看天天狠| 国产日韩1区| 精品国产亚洲日本| 福利一区和二区| 亚洲综合五月| 9国产精品视频| 精品久久久亚洲| 蜜臀91精品一区二区三区| 亚洲播播91| 麻豆久久久久久| 国产日韩三级|