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

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 17:36:48
字體:
來源:轉載
供稿:網友

前言

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中一個比較隱蔽的坑了。

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 公安县| 大同市| 大丰市| 云霄县| 武城县| 蒙城县| 天等县| 上犹县| 博乐市| 望谟县| 玛纳斯县| 剑河县| 玉门市| 新竹市| 泰来县| 迁西县| 綦江县| 宁国市| 峨眉山市| 双峰县| 房产| 巩义市| 贵南县| 昌乐县| 静海县| 奈曼旗| 无锡市| 禹州市| 西林县| 波密县| 堆龙德庆县| 江陵县| 清苑县| 宜宾市| 北安市| 铁力市| 张家界市| 太白县| 麦盖提县| 麦盖提县| 通榆县|