最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年02月13日 10:56:42   作者:Heero.Luo  
這篇文章主要介紹了JS中setTimeout和setInterval的最大延時值的相關資料,文中通過示例代碼介紹的很詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。

前言

JavaScript提供定時執(zhí)行代碼的功能,叫做定時器(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的內容;如果有指定下次更新時間,則通過計時器在該時間點再執(zhí)行一次整個流程。

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

下面模擬一下這個場景:

function log() {
 console.log('executed');
}

var nextUpdateTime = new Date();
// 設為一個月后
nextUpdateTime.setMonth(nextUpdateTime.getMonth() + 1);

var delay = nextUpdateTime - new Date();
setTimeout(log, delay);

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

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

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

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

總結

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

相關文章

  • 如何基于JavaScript判斷圖片是否加載完成

    如何基于JavaScript判斷圖片是否加載完成

    這篇文章主要介紹了如何基于JavaScript判斷圖片是否加載完成,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • JavaScript cookie原理及使用實例

    JavaScript cookie原理及使用實例

    這篇文章主要介紹了JavaScript cookie原理及使用實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • javascript實現選中復選框后相關輸入框變灰不可用的方法

    javascript實現選中復選框后相關輸入框變灰不可用的方法

    這篇文章主要介紹了javascript實現選中復選框后相關輸入框變灰不可用的方法,涉及javascript針對頁面元素屬性的相關操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • 原生JS實現京東查看商品點擊放大

    原生JS實現京東查看商品點擊放大

    這篇文章主要為大家詳細介紹了原生JS實現京東查看商品點擊放大,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Javascript的表單與驗證-非空驗證

    Javascript的表單與驗證-非空驗證

    JavaScript 可用來在數據被送往服務器前對 HTML 表單中的這些輸入數據進行驗證。本文給大家介紹javascript的表單與驗證-非空驗證,對javascript表單驗證相關知識感興趣的朋友一起學習吧
    2016-03-03
  • 可以拖動的div 實現代碼

    可以拖動的div 實現代碼

    可以拖動的div是一個比較難以做到的效果,特別是在瀏覽器對于js代碼的運行效率還不是足夠高的情況下,不過聽說firefox對于js的支持正在增加,大概是料到了js在網頁瀏覽的桌面化趨勢中所占的重要地位吧。
    2009-06-06
  • JavaScript使用Math.Min返回兩個數中較小數的方法

    JavaScript使用Math.Min返回兩個數中較小數的方法

    這篇文章主要介紹了JavaScript使用Math.Min返回兩個數中較小數的方法,涉及javascript中Math.Min方法的使用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • TypeScript聯合類型,交叉類型和類型保護

    TypeScript聯合類型,交叉類型和類型保護

    這篇文章主要介紹了TypeScript聯合類型,交叉類型和類型保護,聯合類型就是定義一些類型,定義的變量只需要滿足任意一種類型即可,交叉類型就是需要滿足所有類型,交叉類型使用,更多內容我們來看看下面文章詳細內容吧
    2021-12-12
  • 微博@符號的用戶名提示效果。(想@到誰?)

    微博@符號的用戶名提示效果。(想@到誰?)

    相信你老早就在騰訊或者新浪的微博上體驗到了,@符號在微博時代的便捷呼叫。
    2010-11-11
  • 一文搞懂JSON(JavaScript Object Notation)

    一文搞懂JSON(JavaScript Object Notation)

    Json 有兩種基本的結構,即 Json對象 和 Json 數組。通過 Json 對象和 Json 數組這兩種結構的組合可以表示各種復雜的結構,今天通過本文給大家介紹JavaScript Object Notation的基本知識,感興趣的朋友一起看看吧
    2021-10-10

最新評論

尉犁县| 饶平县| 安顺市| 二连浩特市| 望江县| 炎陵县| 鹤山市| 长汀县| 东台市| 林口县| 根河市| 晋中市| 延川县| 抚远县| 隆德县| 垣曲县| 晋宁县| 手游| 江达县| 涟源市| 上杭县| 星座| 武鸣县| 宁武县| 米易县| 方正县| 平昌县| 灌南县| 千阳县| 营山县| 唐山市| 施秉县| 固安县| 昌邑市| 盐源县| 新闻| 古田县| 梁河县| 大同市| 泰安市| 崇礼县|