2012-11-17 122 views
3

我正在從我的瀏覽器(IE,Mozilla,Chrome)向我的Java應用程序發出jQuery AJAX jsonp異步請求。如果我的回覆沒有在4分鐘內出現,請求會在所有瀏覽器中超時。如果超時,IE自動觸發新的請求,Mozilla只是終止該請求。我不希望請求超時(我的意思是它應該等到響應不來自服務器)有沒有辦法可以禁用jQuery AJAX JSONP請求的超時?如何禁用AJAX JSONP請求超時?

有些網站建議設置超時值太大,因爲我不想使用此解決方法,因爲儘管經過很長時間後仍會超時。

+0

沒有人注意到這一點?這個問題怎麼樣? – srain

+0

爲什麼你應該保持這麼長時間的請求?在我們的網站,我們只保持55秒,然後關閉連接,建立新的 – srain

回答

1

另一種選擇,可以說不像websockets那樣先進​​,就是輪詢一個地址的結果。考慮以下情況:

您需要在屏幕上顯示報告,但加載需要很長時間。您可以將初始請求發送到服務器。服務器然後啓動報告,並返回客戶端可以輪詢結果的URI。然後,客戶調查該uri,並將(可能)獲得404,直到報告完成。報告完成後,它將在uri中訪問,然後您可以將其顯示在瀏覽器中。

我建議你不要試圖對付瀏覽器超時和幻想的javascript規避行爲。即使您有時會使用它,但由於人們使用不同的瀏覽器(即使是現在的移動設備)也會出錯。有一個強大的解決方案可以保持簡單和可維護性。

正如@BalusC提到的,網絡套接字非常適合這類東西。如果你願意改變你的範例並且有時間放在你的手上,那麼它是一個很好的解決方案。網絡肯定會這樣。但是,如果您受到時間壓力,這可能不是短期內的最佳解決方案。

2

我不認爲你可以讓請求超時然後處理,因爲你已經注意到瀏覽器到底發生了什麼,你幾乎沒有任何控制。

但是,我認爲解決方案非常簡單,只是不要讓您的請求超時。

只需很少的努力,您可以在您的java應用程序中更改您的jsonp回調處理程序,以通知客戶端超時期限已過,並且應該再次執行請求。

我創建了一個功能齊全的工作示例來向您展示我的意思。

這個例子是在nodejs中,但我認爲服務器端的實現應該保持最小。它更多的是關於客戶端代碼的功能。

演示:
http://jsonp-timeout.herokuapp.com/

來源:
https://github.com/helmus/jsonp-timeout/blob/master/public/index.html

這的確是所有相關代碼:
基本上,你把你的JSONP調用一個函數裏面,所以你可以重複使用它。如果您的處理程序接收到"timeout"響應,則可以輕鬆地再次執行請求,直到您的服務器確定其他相關操作。

$(function(){ 
    $("#call").on("click", function(){ 
     var makeJsonpCall = function(){ 
      return $.ajax({ 
       url: "rpc.js", 
       dataType: "jsonp" 
      }); 
     }; 
     var handler = function(data){ 
      if (data === "timeout") { 
       console.log("a timeout occured, forwarding your request"); 
       makeJsonpCall().done(handler); 
       return; 
      }else{ 
       console.log("request completed"); 
      } 
     }; 
     makeJsonpCall().done(handler); 
    }); 
}); 

我覺得這種做法肯定是足夠強大,讓你保持你的接口,以最小的變化,它會場外與跨域JSONP還是工作,如果端點支持它。
您可以將超時時間更改爲2或3分鐘(服務器端),但我不會讓時間更長。

1

我的方式包括設置服務器,客戶端和數據庫。

創建存儲與時間apender一個唯一的哈希鍵的數據庫。這是客戶端請求密鑰。它包含你正在尋找datawise的數據塊,或者一個布爾值來知道這個請求是否完成。

服務器端:當客戶端調用這個請求,存儲它的唯一密鑰,並開始處理該事件。在這個過程完成之前,第二列將會有錯誤。完成後,將該表翻轉爲真。

客戶:中國平安與Ajax請求的服務器,然後在要求使用超時的成功呼叫,並創造超過時間的請求,這將檢查數據庫,看看這個過程完成鏈。在內部請求中,超時需要像每4分鐘一次或任何你喜歡的,但是當它返回成功時,它將具有期望的數據,並且你想要移除定時器。如果它不返回true,那麼錯誤函數將被調用,只是無所事事。

這doouble要求系統將允許您觸發一個請求,並監視它隨着時間的推移。當它完成後,你將有你在找什麼。這個系統會消除超時,因爲它正在發出1個請求,然後隨着時間的推移會觸發檢查請求。

這是我應該怎樣解決這個問題,使得沒有超時。無掛流程掛起的數據抓取等

編輯:你想他們運行清理腳本這會從你做的數據庫表中刪除該行,和所有其他的東西,這是有關不浪費空間。

+0

這是方式複雜恕我直言,包括數據庫似乎只是總矯枉過正 –

+0

它不是太糟糕了,因爲過程仍然可以運行不同的是他們的鏈接方式。用戶只需將運行腳本的結論與JS的回調關聯起來即可。它肯定會解決手頭的問題。 – Fallenreaper