2013-10-09 51 views
0

下面的腳本應該做到以下幾點:奇怪的setTimeout行爲的Javascript

在頁面加載時,將設置爲20秒,然後將所需的內容會自動調用Ajax更新超時。 如果用戶單擊一個說RELOAD的按鈕,它將調用函數reloadContent(),從而清除超時並再次設置一個。

因此,基本上,如果用戶手動重新加載,它將重新啓動超時,以避免過於接近呼叫。

它工作的一半,因爲計時器似乎被重置,但reloadContentTimeout()將在手動加載的操作10秒後執行,這是超時時間的一半。

我做錯了什麼?

謝謝!

/** 
    * Reload content 
    */ 
    function reloadContent(elementId) { 
    $(elementId).load(window.location.href+' '+elementId+' > *'); 
    clearTimeout(timeoutId); 
    reloadContentTimeout(false); 
    } 

    /** 
    * Reload content every X seconds (20) 
    */ 
    var timeoutId; 
    function reloadContentTimeout(now) 
    { 
    now = (typeof now === 'undefined' ? true : now); 
    if(now) { 
     reloadContent('#table-content'); 
    } 
    timeoutId = setTimeout(reloadContentTimeout, 1000 * 20); 
    } 
    reloadContentTimeout(false); 

回答

3

因爲你叫reloadContentTimeout兩次,這重新分配timeoutId。其中一個ID不會被清除,並且事件觸發的次數比應該多。讓我們展開你的調用堆棧:

if (now) { 
    $(elementId).load(); 
    clearTimeout(timeoutId); 
    // this reassigns timeoutId 
    reloadContentTimeout(false) 
} 
// this is where timeoutId is assigned. It gets assigned 
// by this call, but also the call above. 
timeoutId = setTimeout(reloadContentTimeout, 1000 * 20); 

我會切入正題:這將解決問題。

if (now) { 
    /* snip */ 
} 
else { 
    timeoutId = /* snip */ 
} 
+0

事實上,我已經完成了console.log,看到它正在創建2個超時,並且只清除了最後一個。把'else'解決了。 Thansk! – JorgeeFG

1

請檢查您的通話

  • 的順序reloadContentTimeout每次調用與啓動新的超時(對於可能的參數值「不確定」和「假」)
  • 20秒你之後重新加載內容,這將在清除舊內容後啓動一個新的超時(由於計時器已經啓動,這非常無用)。然後你開始另一個超時並重新分配timeoutId而不清除之前創建的那個。現在你有兩個超時運行,這將在每次超時完成後持續發生。

檢查@Explosion Pills的答案。它會幫助你解決問題

+0

謝謝,如果reloadContent是手動觸發的(通過按下重新加載按鈕),清除超時會起作用。 – JorgeeFG