如题,示例代码:
$.ajax({
url:'test',
async:false,
success:function(){
console.log('callback');
}
});
console.log('test');
这两个输出的顺序我在chrome下测试是callback test,为什么会是这样的结果?
如题,示例代码:
$.ajax({
url:'test',
async:false,
success:function(){
console.log('callback');
}
});
console.log('test');
这两个输出的顺序我在chrome下测试是callback test,为什么会是这样的结果?
谢邀, 输出顺序跟你想的不一致的原因,是因为你主动设置了异步变同步,那么就意味着你要按照代码顺序来执行,自然是先 callback, 后 test。
而且官方也提到了这个api 被废弃了。
As of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated
那么也说说大概的原理,jquery 会锁死整个浏览器,直到回调执行完毕为止,也就是说这个时候,浏览器不会干任何事情,现在你使用这个方式,chrome 会给你警告的。你可以看看。
因为你设置了 Ajax 的请求为同步的方式, async:false
这段代码表示将异步设置为 false。所以他会先完全执行完上面的那段代码,再执行接下来的代码。
你将 async:true
,他就会先输出 test
然后输出 callback
。
8 回答4.8k 阅读✓ 已解决
6 回答3.6k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
我认为这里不能单纯按照同步和异步的区别去回答这个问题,而应该是要去理解浏览器调用这个
API
的工作原理。当ajax为异步请求时,浏览器会利用区别于
(javascript与UI共享的)主线程
的另外一条线程去执行这个请求发送,不影响主线程的执行,此时浏览器的针对这段代码的工作就不局限于一条线程。而当请求响应完成后,就会将回调函数推到浏览器工作中的回调队列里去,等待调用栈为空(调用栈为空的时候,test
已经被输出到console中)的时候才去执行对应的对调函数,这种工作原理也称为事件轮询
。因此,上面代码在异步的情况下,代码的运行结果应该是test callback
。而当ajax为同步请求时,浏览器便不再额外为请求发送申请另外一条线程,而是直接用
主线程
去执行这项任务,这就意味着当请求发送未响应返回的期间,javascript以及UI
均遭到阻塞,导致页面卡顿
的现象。首先,我们来看一下下面的代码:此时因为ajax为同步,在请求响应返回的过程中,javascript仍停留在
ajax({})
这行API调用的代码中,当响应返回时,javascript运行所到达的位置是上面xhr.onreadystatechange
的回调函数中,也就是楼主的console.log(callback)
所在的函数中。执行完相关的回调函数之后,javascript才会继续执行ajax({})
的下一行代码。因此也就有了楼主如此的结果。