簡體   English   中英

如何取消已運行的ajax請求(在服務器端)

[英]How to cancel ajax request that has run (on server side)

我想知道是否有一種取消AJAX請求的簡單方法?

除了在客戶端調用XMLHTTPRequest上的“中止”之外,有沒有辦法輕松停止服務器進程? 服務器正在使用Apache。

謝謝

不,絕對沒有簡單的方法。

我可以想到一些復雜的方法,但它們是不可靠的。

你可能會有更多的運氣來開發一個從你剛剛運行的請求中撤消更改的過程(我假設你想要阻止它的原因。)

啟動另一個Ajax請求。 我通過試圖弄清楚如何防止先前的請求在另一個請求被中斷時找到了這個線程。

沒有好的方法可以通過網絡停止請求本身(正如許多人所說的那樣),但是停止請求的影響相對容易。

在服務器端:您可以通過不斷檢查全局變量(充當標志)(如cookie或會話)來exit (或者您需要殺死腳本的任何術語)(再次,假設這些將在腳本執行期間發生變化) 。 此外,您可以將文件或數據庫條目保留為標志(您可以輪詢存在)。

在客戶端:您可以調用abort (在所有瀏覽器中都不起作用,就像其他人所說的那樣),或者您可以在回調的頂部保留一個全局信號量/標志(檢查全局值以查看是否它應該仍然執行或不執行)。 例:

 window.ajaxIsStillGood = true;

 xhr.onreadystatechange = function( )
 {
     if( 4 === xhr.readyState && 200 === xhr.status )
     {
         if( true === window.ajaxIsStillGood ){ /* still good */ }
     }
 }

 /* bad stuff happens */

 window.ajaxIsStillGood = false; // now the code won't execute

發送另一個Ajax請求如何更改由該長進程監視的特定$_SESSION var?

對於PHP,我找到了一種使用session_write_close();來停止或中止的方法session_write_close(); 只需將session_start()放在腳本上即可。 如果您正在使用framwework或OOP,請將其保留為方法的第一行。 發生這種情況是因為會話數據被鎖定,直到ajax完成。

xhr.abort()之后測試並看到另一個頁面正在加載

在此處找到解決方案提示使用jQuery Abort Ajax請求

最簡單的方法是發送503(或類似的)HTTP Response頭並中止服務器端應用程序(或者只是中止應用程序)。 假設沒有發送數據和/或您檢查了HTTP響應頭客戶端,您可以將其視為失敗請求。

最簡潔的答案是不”。 除非你在服務器端談論一個非常長時間運行的后台進程,否則你可以在第二個Ajax請求中啟動停止。 但是,如果您正在討論對Apache / PHP服務器的常規請求,那么沒有...確定您的請求運行的哪個Apache線程就足夠了。

在開始這個過程之前,以某種方式驗證您的Ajax請求要容易得多; 確保它是你想要運行的。 如果您需要用戶意識到他們正在做的事情不會被中斷,您也可以有一個Javascript確認過程。

正如史蒂文發布的那樣,進行逆轉過程聽起來似乎也符合你的最佳利益。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM