jQuery Ajax:如何等待* async *请求成功

时间:2012-01-10 06:01:47

标签: php jquery ajax

我在PHP代码中调用了一个jquery ajax请求。此代码从数据库中获取数据并导出到excel文件中。一旦ajax请求成功,我将获得excel文件弹出下载框。此功能在所有浏览器中都能正常运行。

现在,问题是当jquery请求花费更多时间(7-8分钟)时,在服务器上创建了excel文件,但是没有弹出下载框,30分钟后我收到超时错误。

可能是什么问题,文件是在7分钟内在服务器上创建的,但我没有从ajax请求得到任何响应。我也检查了ajax请求的超时设置为30分钟。

2 个答案:

答案 0 :(得分:1)

即使您设法解决超时问题,让您的客户等待7到8分钟而没有任何进度反馈也远非理想。更好的方法是启动服务器上的导出并立即返回。一旦返回,您可以给出一条“正在导出...”或其他内容的进度消息。然后,您可以进行AJAX调用,定期检查导出状态并返回相应的状态消息。导出完成后,您可以将进度反馈更改为“导出完成:下载文件”,下载文件是指向服务器上创建的Excel文件的链接。您也可以通过代码触发该链接的点击以自动开始下载。

假设您的DIV具有显示导出状态的班级状态

首次启动导出的AJAX调用:

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

第二次AJAX调用以轮询导出进度

$.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);
    }
  }
});

答案 1 :(得分: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>