jQueryAjax:如何等待*async*请求成功


jQuery Ajax: how to wait until *async* requests success

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

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

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

即使您设法解决了超时问题,让您的客户等待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);
    }
  }
});

你做错了:你不想强迫用户为了从你的应用程序获得服务而在页面上停留最多几秒钟。

相反,使用一个小部件,它将定期查询状态页(当然使用ajax),并在工作完成时显示一条消息。

(生成哪种excel文件需要7分钟?数据库转储?)

编辑:

不同的浏览器在处理长ajax请求时会有不同的表现,所以即使用户愿意,也不要依赖它们永远等待。如果将请求生成报告和下载报告脱钩,你的应用程序将更加健壮。

这应该让你知道我在说什么:

create_my_excel_file.hp:

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

check_status.hp:

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>