2015-10-06 63 views
0

我使用AJAX刷新下面Rails的Ajax請求定期直到具體的答案

true,則使用該代碼的頁面上表中:類=> 'BTN BTN-成功BTN-XS' %>

在服務器上,頁面重新加載啓動一個進程來生成一個大表。 目前我從服務器發送一個簡單的「仍然處理」如果大表未準備好,如果大表準備好,然後大量的HTML。

Q1。如何啓動週期性的Ajax刷新? Q2。如何解釋服務器結果以停止週期性的Ajax刷新?

+0

太少的信息給出了適當的反饋 - 請參閱http://stackoverflow.com/help/how-to-ask – wiesion

回答

0

在您的腳本中,您可以設置ajax請求每隔x毫秒關閉一個setInterval,並且在您的timeOut執行的函數內,您可以有一個取消超時執行的條件。這看起來像這樣:

intervalId = setInterval(function() { 
    {{ Do your ajax thing, catch response in variable called data }} 
    if (data.content !== "still processing") { 
     doWhateverThingWithData(data); 
     clearInterval(intervalId); 
    } 
}, 3000) 

3000最後是每次執行之間的毫秒數。

編輯:一不留神使用setTimeout和clearTimeout代替的setInterval和clearInterval

+1

對不起,哥們,但我低估了,因爲這是不實際的。 –

1

雖然@ mb_s88的答案是直接回答你的問題(我甚至upvoted它),我建議你重新考慮工作流程。

我建議AJAX響應總是返回X或數據量(即最多100行)。

更好的工作流程會感覺到響應更快,用戶可以體驗到「發生了什麼」(而不僅僅是等待),並且可以通過使用更小的數據庫查詢來避免服務器端的大型阻塞任務。

例如:

我建議第一AJAX請求將請求第一「頁」的結果和一個「繼續」標誌被設置頁面是否完整(即返回100行會啓動「繼續」工作流程)。

比我會建議在加載下一個「頁面」時顯示現有數據,每個請求都要求服務器查找特定頁面(例如頁碼從0開始,行號從0開始,要求page_number=1將返回行page_number * 100100+(page_number * 100))。

不完整的頁面(少於100行)將停止循環。如您所見,此設計將使用較小的SQL請求(請求X到Y行而不是整個數據),感覺對用戶更具響應性,並且允許用戶開始讀取數據,即使是越來越多的數據在未來

1

什麼你問的是棘手的有以下幾個原因:

一個AJAX請求是單個用戶的請求。除非您使用多線程,否則發送多個請求不會讓您訪問相同的響應,這相當於每次ping服務器時都會打開新的請求。

與大多數人認爲的不同,阿賈克斯不是一個神奇的燈籠。它只是一種讓您的瀏覽器向您的服務器發送&進程XML請求(JSON)的方法。事實上,阿賈克斯本身代表一個同步Ĵ avascript 一個第二X ML:

enter image description here

因此...


如何開始定期AJAX刷新?

你不知道。

有兩種選擇,您都:

  1. 的Ajax長輪詢
  2. AJAX回調

Long Pollingmb_s88描述:

(function poll(){ 
    setTimeout(function(){ 
     $.ajax({ url: "server", success: function(data){ 
     //Update your dashboard gauge 
     salesGauge.setValue(data.value); 

     //Setup the next poll recursively 
     poll(); 
     }, dataType: "json"}); 
    }, 30000); 
})(); 

您每隔X秒向服務器發送一次Ajax請求,並在必要時將響應附加到DOM。這通常用於極低負載的實例(因爲您向服務器發送不斷請求),例如聊天應用程序,評論等。

總之,長查詢是web sockets的小弟弟。這意味着通過JS實現近實時功能的快速方法。您可以使用它來提供非常低級的信息,例如聊天響應,通知等。

Ajax的主要限制是它會用請求轟炸您的服務器。這很糟糕,特別是在處理大量數據時。

-

下一個選項是使用ajax callbacks

這主要是在那裏你換的功能時,您Ajax響應,讓您處理異步要求同步。聽起來很複雜?不是真的,一旦你瞭解了Ajax如何工作。

Ajax旨在爲您提供一種方法,可讓您將異步請求發送到您的服務器。這意味着您的請求將圍繞標準瀏覽器流程進行。

enter image description here

這是一個標準的「同步」的要求,因爲是所有Web瀏覽器是如何工作的。

設計意圖是這樣的,你會收到一個迴應請求你發送。例如,如果你點擊一個鏈接,你實際上是指示瀏覽器發送一個請求到服務器,它將通過一個響應(以一個新的網頁的形式)。

AJAX使您能夠繞過這一點,增加了發送請求超出範圍的功能。這樣做的好處包括這樣的人 - 動態頁面更新,通知,被應用over-and-above the original request頁面上的新的信息...

enter image description here

問題與大多數Ajax功能是必須要等待。是異步的,你無法將它添加到流程中......簡而言之,如果你有依賴功能,沒有辦法「等待」

解決這個問題的方法是使用一個回調 ...

$(document).ready(function(){ 
    doAjax("url", {data: here}, function(){ 
     // Ajax "success" callback 
    }, function(){ 
     // Ajax "error" callback 
    }); 
}); 

doAjax(url, data, success, error){ 
    $.ajax({ 
     url: url, 
     data: data, 
     success: success(data), 
     error: error(data) 
    }); 
}); 

這給你發送一個Ajax請求,「等待」響應的能力。這與設置凍結瀏覽器的「synchronous:true」相反。


如何解釋服務器結果停止定期AJAX刷新?

您使用Ajax回調並等待響應。

如果它太大,請將其分成多個頁面(根據@myst's答案)。

如果您仍然認爲您可以ping您的服務器並針對同一請求獲取多個響應,請閱讀我再次寫入的內容。一個請求=一個響應。