2011-09-10 35 views
4
$(document).ready ( 

    function ready() { 
     var tester = $.ajax({ 
       async: false, 
       url: "test_parse.php" 
      }).responseText; 
     document.getElementById('test').innerHTML = tester; 
     setTimeout(ready(), 3000); 
    } 

); 

嗨內部本身的功能我想打電話給內本身這樣的函數但每次我這樣做,我的瀏覽器時,只是不斷加載,最終的Apache關閉(顯然不是我期望的結果)。想想你們可以幫我找出一個解決方案?謝謝!調用使用setTimeout的

+0

你可以從函數外部調用setTimeout嗎? –

+0

我也不認爲把函數放在$(document).ready({})中是正確的; –

+1

@Devin - document.ready _expects_作爲參數的函數表達式;這個函數是否有名字並不重要。 (在任何人指出之前,我知道函數表達式不是唯一的選擇,但我認爲它是最常用的選項。) – nnnnnn

回答

10

的setTimeout需要一個函數引用:

setTimeout(ready, 3000); 

setTimeout(ready(), 3000); 

而且他這樣說,我也這樣做:

$(document).ready ( 

    function ready() { 
     var tester = $.ajax({ 
       url: "test_parse.php", 
       success: function (data) { 
        document.getElementById('test').innerHTML = data; 
        setTimeout(ready, 3000); 
       } 
      }) 
    } 

); 

因爲async: false將鎖住瀏覽器直到從服務器返回數據爲止

+1

也許他出於正當理由在那裏放了'async:false'? –

+0

@Travis,也許?你能說出一個好的理由嗎? – Joe

+1

看來他想做一個同步請求...你有這個問題嗎? –

6

這是錯誤的:

setTimeout(ready(), 3000); 

這是正確的:

setTimeout(ready, 3000); 

ready()實際調用該函數。 ready只是對函數的引用,這就是你想要的。

+0

太棒了!謝謝。我知道這是一件小事。 – Vivek

0

你爲什麼試圖在自己內部調用函數?當然,你所需要做的就是將setTimeout移出函數外,然後每3000ms調用一次ready()函數?你想要你的輸出是什麼?

+0

函數自我調用完全可以接受。 –

+0

'ready()'調用它自己(通過成功回調),這樣如果其中一個'$ .ajax'調用花費太長時間,事情就不會得到支持。我傾向於使用這種方法而不是'setInterval'來精確地保持順序並且不備份。 –

2

setTimeout需要一個函數引用作爲第一個參數,您有一個正在傳遞調用ready()的結果的函數調用。

這造成無限循環。

您需要在「準備」中度過,而不是「準備就緒()」

setTimeout(ready, 3000); 

如果你想在排隊結構以便發生Ajax請求,你要火在先前的ajax調用之後成功執行setTimeout,而不是立即執行,否則將根據服務器如何響應每個請求,以任意間隔返回並更新ajax結果。

$.ajax({ 
    // your ajax settings 
}).success(function() { 
    // fire off the next one 3 secs after the last one completes 
    setTimeout(ready, 3000); 
}); 

這比使用阻止瀏覽器的async:false設置要好。