2012-01-10 23 views
0

我在我的PHP代碼中調用了一個jquery ajax請求。此代碼從數據庫中獲取數據並導出到excel文件中。一旦ajax請求成功,我將獲得excel文件彈出式下載框。此功能在所有瀏覽器中均正常工作。jQuery Ajax:如何等待* async *請求成功

現在,問題是,當jquery請求需要更多時間(7-8分鐘),在服務器上創建excel文件,但下載框不彈出,30分鐘後我得到超時錯誤。

什麼可能是問題,在7分鐘內在服務器上創建文件,但我沒有收到任何來自ajax請求的響應。我也檢查了ajax請求的超時設置爲30分鐘。

+0

所以你認爲,你的客戶將等待7-8分鐘才能開始下載文件?請提供您嘗試的代碼。 – 2012-01-10 06:05:22

+0

你認爲它來自excel文件的創建?試試你的代碼去激活該部分,看看是否發生了什麼 – user1040899 2012-01-10 06:07:28

+0

你試過resultSets嗎? – Sandeep 2012-01-10 06:07:57

回答

0

您做錯了:您不希望強制用戶在頁面上停留超過幾秒鐘,以便從您的應用獲得服務。

而是使用一個小部件,它會定期查詢一個狀態頁(當然是用ajax),並在作業完成時顯示一條消息。

(什麼樣的Excel文件走的是7分生成一個數據庫轉儲?)

編輯:

不同的瀏覽器會表現不同的長Ajax請求,所以不依賴於它們在等待即使用戶願意,也可以永遠在身邊。如果您要求生成報告並下載報告,則您的應用程序將更加健壯。

這應該給你什麼,我談論的一個想法:

create_my_excel_file.php:

$_SESSION['excel_status']='generating'; 
create_the_excel_file(); 
$_SESSION['excel_status']='finished'; 

check_status.php:

echo $_SESSION['excel_status']; 

user_interface.php:

<script type="text/javascript"> 
function initiateRequest(){ 
    $.ajax('create_my_excel_file.php'); 
    setInterval('checkForCompletion()', 5000); 
} 
function checkForCompletion(){ 
    $.get('check_status.php', function(data){ 
     if('finished'==data){ 
      alert('Completed! Download the file now.'); 
      location.href='file_download.php'; 
     } 
    }); 
} 
</script> 
<a href="javascript:initiateRequest();">Generate the file</a> 
+0

這個模塊是報告並且只有管理員用戶可以訪問。唱片在Lacs,這就是爲什麼它需要幾分鐘。時間不是問題,如果需要20分鐘,那也很好。但爲什麼ajax請求沒有響應長請求。\ – user1138143 2012-01-10 06:20:45

+0

任何其他最簡單的方法來處理這個問題。輸出緩衝在php.ini中打開。在我本地的wamp服務器上運行相同的代碼。即使我把2行代碼<?php sleep(300); ?>,5分鐘後不響應。 – user1138143 2012-01-11 08:54:02

+0

試圖一次完成所有操作* * * *。如果請求等待很長時間,請求就很容易失敗。輕鬆將其分解成更小,簡單的步驟。 – bdares 2012-01-12 03:38:50

1

即使您設法解決超時,讓您的客戶等待7到8分鐘,但沒有任何進展,反饋將遠非理想。更好的辦法是發起在服務器上導出並立即返回。一旦這個返回,你可以給出一個進度消息,說'正在導出..'或其他東西。然後,您可以進行AJAX調用,定期檢查導出的狀態並返回相應的狀態消息。導出完成後,您可以將進度反饋更改爲「導出完成:下載文件」,下載文件是指向服務器上創建的Excel文件的鏈接。您還可以通過代碼觸發該鏈接的點擊以自動開始下載。

假設你已經帶班狀態的DIV這表明出口狀況

首先AJAX調用啓動導出:

$.post({ 
    url: '/export/', 
    ... 
    success: function(data) { 
    $('.status').html('Export in progress. Please wait...'); 
    } 
}); 

二AJAX調用poll出口進度

$.post({ 
    url: '/exportstatus/', 
    ... 
    success: function(data) { 
    if(data=='OK') { 
     $('.status').html('Export complete: <a class="exportedfile" href="/path/to/exported/file">Download File</a>'); 
     setTimeout(function() { 
      $('.status').find('a').click(); // trigger autostart of download 
}, 1000); 
    } 
    } 
}); 
+0

任何其他最簡單的方法來處理這個問題。輸出緩衝在php.ini中打開。在我本地的wamp服務器上運行相同的代碼。即使我把2行代碼<?php sleep(300); ?>,5分鐘後沒有響應 – user1138143 2012-01-11 08:54:13