函数中的Ajax调用序列

时间:2012-10-16 12:08:48

标签: javascript

我有一个小问题。说我有一个js功能

$(function() {
 $(".button").click(function(){ 
 var id=$(this).attr('id');
 var dataString = 'id='+ id ;
 $.ajax({
   type: "POST",
   url: "download_number.php",
   data: dataString,
   cache: false,
   success: function(html)
   {
     $("#div_"+id).html(html);
   }  });
   window.open('File_download.php?file_id='+id, '_blank' );
  });

你可以看到window.open来电是在$ .ajax电话之后

是否保证每次在页面重新加载之前都会执行$ .ajax调用,如果没有那么

我们不应该在成功函数中声明window.open吗?

在我看来,当服务器响应缓慢时,页面将首先重新加载,$.ajax调用将被window.open函数中断

但是我在这里得到一个downvote同样的原因stackoverflow.com/questions/12908138/how-to-get-the-id-or-name-of-related-file/

感谢让我的信念更加强大

2 个答案:

答案 0 :(得分:1)

在您的示例中,window.open函数将始终(!)在success调用的ajax回调函数之前调用。 Ajax流量始终是异步的,而window.open函数驻留在同步JS <script>标记中。

由于JavaScript是单线程的,因此所有同步语句将始终在ajax setTimeout animate等任何异步功能之前执行。

$.ajax({
   type: "POST",
   url: "download_number.php",
   data: dataString,
   cache: false,
   success: function(html) { // asynchronous functionality
     $("#div_"+id).html(html);
   }  
}); 
// within synchronous script statements
window.open('File_download.php', '_blank' );

答案 1 :(得分:1)

是的,Ajax是异步的,因此您将在启动XHR过程后立即打开该窗口。要下载已处理的数据,请从成功回调中打开新窗口。然而,我不确定“在页面重新加载之前”是什么意思 - 没有代码可以做到这一点。

此外,我不知道您的服务器的行为,file_download.php似乎独立于您的ajax调用。你不应该通过那里的ajax传递download_number吗?