jQuery:为什么$.ajax()不等待请求完成之前返回?

我花了3个小时调试一些代码,发现它是由我造成的,假设下面的代码的执行顺序是线性的:
$.ajax( {ajax options} );
console.log('I was assuming this would execute once the ajax request was complete');

这不是我第一次引起我的问​​题,而只是想知道这个行为的原因是什么?

是不是所有的ajax请求不能阻止可能与ajax请求无关的其他脚本执行?

解决方法

大多数其他答案都在回答如何处理这个问题.我想简要地看一下,为什么异步在这种情况下是好的.

事实上,大多数浏览器中的JavaScript是异步的.举个例子,这段代码

document.getElementById('foo').onclick = function() {
    alert('foo clicked');
};
document.getElementById('bar').onclick = function() {
    alert('bar clicked');
};

哪个会先运行?您不知道,因为浏览器模型固有的异步(或事实上大多数事件驱动的代码).当事件发生时运行代码.您设置文档,然后等待事件发生,您的代码可以按各种不同的顺序执行,具体取决于事件先发生. Javascript代码需要在页面的整个生命周期中执行,而不仅仅是在第一次创建时.

所以在一般的JavaScript编程(或至少,JavaScript编程超出最简单的层次)通常将是异步的.此外,HTTP请求也是异步的,这是很有意义的.

首先,当你暗示你的问题,使代码同步将阻止执行.也就是说,您可能不想让动画等待两秒钟才能开始,因为您正在向两个进一步的HTTP请求发送一个HTTP请求.服务器响应时间可能是(a)不规则和(b)缓慢,因此,您的应用程序的设计不依赖于服务器响应的速度是没有意义的.

第二,更重要的是,您的用户不会停止使用该页面,因为您的脚本正在进行AJAX调用.您的用户不在乎您的用户可能会关心您的正常的滚动行为不起作用,因为您的脚本目前被绑定在一个不相关的AJAX请求中.为了配合整个浏览器Javascript编程的异步性质,绝大多数HTTP调用应该是非阻塞的,异步的.

相关文章

jQuery插件的种类 1、封装对象方法 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进...
扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间。 入门 编写一个jQuery插件开始于给...
最近项目中需要实现3D图片层叠旋转木马切换的效果,于是用到了jquery.roundabout.js。 兼容性如图: ht...
一、什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异...
AMD 模块 AMD(异步模块定义,Asynchronous Module Definition)格式总体的目标是为现在的开发者提供一...