2013-07-19 37 views
1

使用jQUery进行AJAX调用时,如果在执行$ .ajax()之后,在下一行JavaScript之前假定返回客户端的响应,浏览器是否继续执行在调用AJAX回调函数之前的脚本,还是会立即暂停执行并跳转到回调函数?例如:JavaScript - 在处理ajax回调之前完成执行

function MyAJAXFunction() { 

    // Make AJAX call 
    $.ajax({ 
     url: "/api/...", 
     success: function() { 
      alert("AJAX Callback"); 
     } 
    }); 

    // Do lots of work 

    alert("After lots of work"); 

} 

哪个警报将首先执行,假设AJAX调用会非常快,“大量的工作”会很慢?

我正在尝试启动一个AJAX调用,然后再执行一个缓慢的任务,即AJAX回调依赖于两个操作并行。不过,我仍然需要保证AJAX回调会执行第二次。我意识到这也可以用jQuery Differences和Promise对象完成,但我宁愿避免这些。

+0

您是否从ajax调用中获取数据? – James

回答

2

这里的关键概念是如何在浏览器内以单线程方式执行Javascript。浏览器维护一个事件队列,其中新事件(例如接收AJAX调用的响应)在发生时排队。浏览器还运行单线程事件循环,其责任是

  1. 继续寻找事件。
  2. 事件发生时触发事件处理程序。

但是,由于它的所有单线程循环,如果正在运行一个函数,下一个事件的处理函数只有在当前函数完全结束后才会被拾取。因此,无论响应何时到来,AJAX响应处理程序中的警报将始终显示在主函数中的警报之后。

+0

我不同意@ adeneo的回答上面。这当然不是事实。 –

+0

我也不同意我的评论,我想我误解了!如果“大量工作”阻塞线程,成功回调将被添加到队列的底部,当然最后会被执行。我不会在生产代码中对它进行押注,但它是它应该表现的方式。 – adeneo

+0

应该证明你的观点 - > http://jsfiddle.net/a8z56/ – adeneo

相关问题