我正在從我的瀏覽器(IE,Mozilla,Chrome)向我的Java應用程序發出jQuery AJAX jsonp異步請求。如果我的回覆沒有在4分鐘內出現,請求會在所有瀏覽器中超時。如果超時,IE自動觸發新的請求,Mozilla只是終止該請求。我不希望請求超時(我的意思是它應該等到響應不來自服務器)有沒有辦法可以禁用jQuery AJAX JSONP請求的超時?如何禁用AJAX JSONP請求超時?
有些網站建議設置超時值太大,因爲我不想使用此解決方法,因爲儘管經過很長時間後仍會超時。
我正在從我的瀏覽器(IE,Mozilla,Chrome)向我的Java應用程序發出jQuery AJAX jsonp異步請求。如果我的回覆沒有在4分鐘內出現,請求會在所有瀏覽器中超時。如果超時,IE自動觸發新的請求,Mozilla只是終止該請求。我不希望請求超時(我的意思是它應該等到響應不來自服務器)有沒有辦法可以禁用jQuery AJAX JSONP請求的超時?如何禁用AJAX JSONP請求超時?
有些網站建議設置超時值太大,因爲我不想使用此解決方法,因爲儘管經過很長時間後仍會超時。
另一種選擇,可以說不像websockets那樣先進,就是輪詢一個地址的結果。考慮以下情況:
您需要在屏幕上顯示報告,但加載需要很長時間。您可以將初始請求發送到服務器。服務器然後啓動報告,並返回客戶端可以輪詢結果的URI。然後,客戶調查該uri,並將(可能)獲得404,直到報告完成。報告完成後,它將在uri中訪問,然後您可以將其顯示在瀏覽器中。
我建議你不要試圖對付瀏覽器超時和幻想的javascript規避行爲。即使您有時會使用它,但由於人們使用不同的瀏覽器(即使是現在的移動設備)也會出錯。有一個強大的解決方案可以保持簡單和可維護性。
正如@BalusC提到的,網絡套接字非常適合這類東西。如果你願意改變你的範例並且有時間放在你的手上,那麼它是一個很好的解決方案。網絡肯定會這樣。但是,如果您受到時間壓力,這可能不是短期內的最佳解決方案。
我不認爲你可以讓請求超時然後處理,因爲你已經注意到瀏覽器到底發生了什麼,你幾乎沒有任何控制。
但是,我認爲解決方案非常簡單,只是不要讓您的請求超時。
只需很少的努力,您可以在您的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分鐘(服務器端),但我不會讓時間更長。
我的方式包括設置服務器,客戶端和數據庫。
創建存儲與時間apender一個唯一的哈希鍵的數據庫。這是客戶端請求密鑰。它包含你正在尋找datawise的數據塊,或者一個布爾值來知道這個請求是否完成。
服務器端:當客戶端調用這個請求,存儲它的唯一密鑰,並開始處理該事件。在這個過程完成之前,第二列將會有錯誤。完成後,將該表翻轉爲真。
客戶:中國平安與Ajax請求的服務器,然後在要求使用超時的成功呼叫,並創造超過時間的請求,這將檢查數據庫,看看這個過程完成鏈。在內部請求中,超時需要像每4分鐘一次或任何你喜歡的,但是當它返回成功時,它將具有期望的數據,並且你想要移除定時器。如果它不返回true,那麼錯誤函數將被調用,只是無所事事。
這doouble要求系統將允許您觸發一個請求,並監視它隨着時間的推移。當它完成後,你將有你在找什麼。這個系統會消除超時,因爲它正在發出1個請求,然後隨着時間的推移會觸發檢查請求。
這是我應該怎樣解決這個問題,使得沒有超時。無掛流程掛起的數據抓取等
編輯:你想他們運行清理腳本這會從你做的數據庫表中刪除該行,和所有其他的東西,這是有關不浪費空間。
這是方式複雜恕我直言,包括數據庫似乎只是總矯枉過正 –
它不是太糟糕了,因爲過程仍然可以運行不同的是他們的鏈接方式。用戶只需將運行腳本的結論與JS的回調關聯起來即可。它肯定會解決手頭的問題。 – Fallenreaper
沒有人注意到這一點?這個問題怎麼樣? – srain
爲什麼你應該保持這麼長時間的請求?在我們的網站,我們只保持55秒,然後關閉連接,建立新的 – srain