2013-02-10 76 views
1

我向服務器發送ajax請求,我只需要知道何時完成將用戶重定向到第二頁。 它正在大多數時間工作,但是如果服務器花費很長時間回答(例如10分鐘),則可能發生沒有回調函數被調用並且請求持續等待。jQuery ajax調用永不結束(成功和錯誤回調未被觸發)

我的代碼如下:

$.ajax({ 
     type: 'post', 
     url: 'request.php', 
     success: function(data) { 
      alert("Success: "+data); 
      window.location.replace("success.php"); 
     }, 
     error: function (xhr, ajaxOptions, thrownError) { 
      alert("Ajax error: "+xhr.status+" - "+thrownError); 
      window.location.replace("error.php"); 
     } 
}); 

正如你所看到的,我試圖檢查是否有任何錯誤,但據我已到達,Ajax請求的行爲如同它沒有完成(不會發出警報或重定向)。但是,服務器中的PHP代碼在結束之前運行無錯誤。

我不知道在哪裏尋找錯誤,因爲我在考慮瀏覽器或服務器中的超時問題,但它似乎不是原因。而且,由於相同的代碼在短暫的等待時間內工作,我無法想象其他可能的原因。

謝謝!

+0

網絡控制檯是否顯示任何有趣的內容?瀏覽器是否看到請求完成? – 2013-02-10 16:06:44

+0

您需要在整個後端PHP腳本中添加錯誤日誌代碼。這可能是holdup的候選對象,因爲你不能從視覺上輸出任何東西,所以error_log是要走的路。那,和控制檯已經被建議。 – 2013-02-10 16:08:11

+0

「相同的代碼在短時間內工作」,這意味着什麼? 10分鐘的頁面響應,真的嗎? – 2013-02-10 16:10:45

回答

0

我敢打賭,您的Web服務器上的超時會導致連接無效,這可能意味着沒有答覆被髮回。 在這種情況下,ajax超時選項可能對您有好處。如果我是你,我會以不同的方式做:因爲你已經使用ajax,爲什麼不每隔一秒就ping服務器,並檢查過程是否完成,是時候重定向了,而不是保持連接打開?這樣您就沒有超時問題,並且不會將連接鎖定在不會發送任何數據的會話上,而只會等待服務器端進程完成。更具擴展性和可靠性,更適合http連接。

+0

謝謝你的回答!正如所指出的,我已經通過每隔x秒詢問服務器來解決問題,如果該過程已經完成。 但據我所知,這意味着服務器的行爲會使連接無效而不迴應,但讓代碼執行繼續?我在哪裏可以找到這個服務器端連接超時?如果連接被服務器關閉,我可以強制將某些內容發送給瀏覽器嗎? – sergiold 2013-02-10 21:09:29

+0

需要很長時間才能運行的進程應該在與回答http連接的進程不同的線程中執行。這意味着這樣的請求的答案應該具有「得到它,我在上面,在幾秒鐘內打電話給我檢查我」的含義,而不是「這裏是答案」。這意味着如果請求有效並且您正在尋找答案,則應立即發送簡單的「OK」響應(如果使用ajax),或者如果請求是簡單的html請求,則具有定期檢查的任何jsp 。你不應該進入超時狀態,因爲原始請求的 – TheZuck 2013-02-11 11:02:00

+0

響應是一個簡單的「得到它」而不用等待實際的答案。 – TheZuck 2013-02-11 11:02:33