国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JS中setTimeout和setInterval的最大延時值詳解

2024-05-06 15:11:43
字體:
來源:轉載
供稿:網友

前言

JavaScript提供定時執行代碼的功能,叫做定時器(timer),主要由setTimeout()setInterval()這兩個函數來完成。而這篇文中主要給大家介紹的是關于JS中setTimeout和setInterval最大延時值的相關問題,需要的朋友們下面來一起學習學習吧。

先來看這樣一段代碼:

function update() { loadData().then(function(data) {  $('#content').html(data.content);  var delay = data.nextUpdateTime - new Date();  if (delay > 0) {   setTimeout(update, delay);  } });}

其流程非常簡單:通過AJAX加載數據后更新HTML的內容;如果有指定下次更新時間,則通過計時器在該時間點再執行一次整個流程。

要說這段代碼有什么隱患的話,那就是data.nextUpdateTime與當前時間的時間差(即delay變量的值)比較小的時候,會導致內容頻繁更新。但這是屬于正常的業務邏輯,要優化就只能犧牲內容更新的即時性。然而這里我要說的是,當時間差非常大的時候,也會出現同樣的問題。

下面模擬一下這個場景:

function log() { console.log('executed');}var nextUpdateTime = new Date();// 設為一個月后nextUpdateTime.setMonth(nextUpdateTime.getMonth() + 1);var delay = nextUpdateTime - new Date();setTimeout(log, delay);

這段代碼的原意是讓log函數在一個月后執行,但是運行一下就可以發現,該函數會馬上執行。為什么會這樣呢?

搜一下相關內容可以發現,setTimeout是使用Int32來存儲延時參數值的,也就是說最大的延時值是2^31-1。一旦超過了最大值,其效果就跟延時值為0的情況一樣,也就是馬上執行。

這個最大的延時值已經接近一個月了,一般情況下,用戶也不會長時間開著一個網頁,如果真開了這么久,那就刷新一下吧:

function update() { loadData().then(function(data) {  $('#content').html(data.content);  var delay = data.nextUpdateTime - new Date();  if (delay > 0) {   // 限制最大延時值為一天   var ONE_DAY = 24 * 60 * 60 * 1000;   if (delay > ONE_DAY) {    setTimeout(function() {     window.location.reload();    }, ONE_DAY);   } else {    setTimeout(update, delay);   }  } });}

同樣的問題也存在于setInterval中。這也算是Javascript中一個比較隱蔽的坑了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 石城县| 甘肃省| 武鸣县| 湖州市| 兴城市| 商南县| 万源市| 墨江| 垦利县| 会宁县| 三明市| 西华县| 阳江市| 梅州市| 武陟县| 呼玛县| 双鸭山市| 运城市| 白朗县| 京山县| 青海省| 山东省| 高碑店市| 拉萨市| 连江县| 仁怀市| 志丹县| 眉山市| 永仁县| 普安县| 海口市| 西昌市| 渝北区| 宁波市| 甘肃省| 平阳县| 海林市| 福建省| 北票市| 清苑县| 循化|