2012-06-07 54 views
0
<script> 
    $(document).ready(function(){ 
     ajaxcall(); 
    }); 
    function ajaxcall(){ 
    $.ajax({ 
      url: 'test.php', 
      success: function(data) { 
       data = data.split(':'); 
       $('#hours').html(data[0]); 
       $('#minutes').html(data[1]); 
       $('#seconds').html(data[2]); 
       ajaxcall(); 
      } 
     }); 
    } 
    </script> 
    <span id="hours">0</span>:<span id="minutes">0</span>:<span id="seconds">0</span> 

在這段代碼中,我調用了ajax函數onsuccess,所以它將是無限循環。它會導致任何問題?如果我遞歸調用ajax函數會發生什麼?它可能會導致任何問題。

+0

無限循環總是不受歡迎的。您的瀏覽器將崩潰。 –

+0

你想通過這樣做解決什麼問題? – vcsjones

+0

這取決於你「定義問題」的定義。讓您的用戶[DoS](http://en.wikipedia.org/wiki/Denial-of-service_attack)服務器可能會造成問題。 – vstm

回答

2

這會導致您的瀏覽器最終耗盡內存並崩潰,因爲每次調用都將保存在調用堆棧中。我錯了;回調是異步的,所以控制會離開父功能。如果您正在嘗試更新時間,我建議您可以這樣做:

$(document).ready(function(){ 
    setInterval(ajaxcall, 1000); //calls ajaxcall every 1000 microseconds 
}); 

function ajaxcall(){ 
    $.ajax({ 
     url: 'test.php', 
     success: function(data) { 
      data = data.split(':'); 
      $('#hours').html(data[0]); 
      $('#minutes').html(data[1]); 
      $('#seconds').html(data[2]); 
     } 
    }); 
} 
+1

是的,這樣做。每秒調用該方法是在網頁中構建時鐘,計時器或任何其他基於時間的系統的正確方法,而不是無休止地循環。遞歸函數必須結束,它不能是一個無限循環。 –

+0

我認爲這是正確的。謝謝。 – chella

1

沒什麼不好的事情會發生。它會發出ajax呼叫,等待它返回,然後永遠做出另一個。這本身沒有任何問題。請注意,您的服務器端操作不會太重,並且您不會傳輸太多的數據而不會浪費太多帶寬。

如果您希望能夠阻止它,您可以創建一個變量來定義是否繼續進行調用,並在每次關閉時調用它。

var keepCalling = true; 

function ajaxCall() { 
    if (!keepCalling) 
     return; 

    //ajax call... 
} 

設置keepCallingfalse當前一個完成之後將停止通話。

+0

瀏覽器最終會耗盡內存。這可能需要一些時間,但它會*發生。只有很多電話可以保留在通話堆棧中。 –

+0

我正在測試這個。 –

+0

只要做到這一點:'函數遞歸(){遞歸();}',因爲這就是OP代碼中實質上發生的事情。只是它發生的速度較慢。 –

相關問題