2013-08-29 25 views
0

我做了一個ajax調用來獲得一個毫秒值,這將連續調用不同 。jQuery setTimeout,可變時間參數

我顯示元素中返回的值。

然後我想取這個值並將它用作setTimeout中的時間參數 。

當我的函數再次執行時,我想使用返回的新值重置setTimeout 時間參數。

這裏是我的,但它只是初步在十秒鐘後執行一次:

var timeInterval = 10000; 
setTimeout(function() { 
$.ajax({ 
    type: "POST", 
    url: "NowPlaying.asmx/GetMilliSeconds", 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(msg) { 
     $('#duration').html(msg.d.MilliSeconds); 
     clearTimeout(timeInterval); 
     timeInterval = msg.d.MilliSeconds; 
    } 
    }); 
    }, timeInterval); 

是否有可能保持基於連續調用GetMilliSeconds不同的值重置一個時間間隔?

回答

1

setTimeout只會觸發一次,因爲這就是它設計的目的。 (也許你有它setInterval混淆?)

clearTimeout(timeInterval)沒有任何意義,原因有二:

  1. 你必須從setTimeout通過它的返回值,而不是一個區間。
  2. 您不需要在發生超時後清除超時,因爲每次調用setTimeout時只會觸發一次。

這可能是更接近你是瞄準:

var timeInterval = 10000; 
var interval = setInterval(callBack, timeInterval); 

function callBack() { 
    $.ajax({ 
    type: "POST", 
    url: "NowPlaying.asmx/GetMilliSeconds", 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(msg) { 
     $('#duration').html(msg.d.MilliSeconds); 
     timeInterval = msg.d.MilliSeconds; 

     // Update interval with the new value of timeInterval: 
     clearInterval(interval); 
     interval = setInterval(callBack, timeInterval); 
    } 
    }); 
    } 
+0

ahh,擊敗我,並且擊中所有重要的點。幫你! +1:P – Jordan

+0

謝謝。在第一次執行clearInterval之後,第二次調用callBack。我在想,是不是第一個叫回來的電話會退出?是否有某種堆疊在某個地方?我只是想知道,如果每個callBack調用都在等待退出,會消耗什麼資源。我不太瞭解jQuery和javaScript。這個遞歸部分讓我感到困惑。 – user847335

+0

@ user847335由於ajax是異步的,它會在不同的線程上執行正常代碼。這意味着第一次通話在第二次通話之前退出。請注意,如果timeInterval太短,'callBack'可能會在被清除之前再次被調用。 – Jordan

0

你應該有這一切的功能,遞歸調用它在你的成功塊。像這樣:

function() NowPlaying (timeInterval) { 
    //Your code... 

    success: function(msg) { 
     $('#duration').html(msg.d.MilliSeconds); 
     clearTimeout(IntervalHandler); 
     NowPlaying(msg.d.MilliSeconds); 
    } 
} 

您當然需要一個基本案例來知道何時退出遞歸循環。

此外,您使用clearTimeout的方式存在問題。你在你的時間間隔中調用它,在你的代碼中是10000,但這不是你的setTimeout的處理程序。因爲您使用的是setTimeout,所以您不需要清除處理程序,因爲它只能通過clearTimeout訪問setTimeout的代碼:)

+0

謝謝,我在標記答案之後纔看到您的評論。是的,基本案例在這個遞歸中對我來說很有意義。上面的Krall的帖子中的答案是否證明了這種擔憂?另外,我沒有意識到你需要從setInterval中獲取返回值來清除它。非常感謝你們的幫助。 – user847335

+0

@ user847335不用擔心,Krall的帖子措辭更加貼切,並且符合所有要點,除了接受它之外,您還應該投票支持他。我不是100%肯定他有一個基本情況,但是,在'callback()'的開始部分引入這個塊可能是一個好主意:'if(iWantOut){clearInterval(interval); } else {//處理所有其他事情}'其中'iWantOut'是一些條件,當你希望代碼停止時是true – Jordan