阅读jQuery 1.8源代码,
为什么setTimeout的延迟时间为0毫秒? (而不仅仅是执行回调?)
https://github.com/jquery/jquery/blob/1.8.0/src/ajax/xhr.js#L196
if ( !s.async ) {
callback();
} else if ( xhr.readyState === 4 ) {
// (IE6 & IE7) if it's in cache and has been
// retrieved directly we need to fire the callback
//-------->// WHY do setTimeout with 0 ms delay ?
setTimeout( callback, 0 );
} else {
handle = ++xhrId;
答案 0 :(得分:3)
这是针对IE6和IE7的特性的解决方法,它可以从缓存中检索AJAX结果而不触发XMLHTTPRequest
回调,立即将其readyState
属性设置为4
。
然而,$.ajax
的API合约要求它立即返回异步请求(即不调用程序员提供的回调)。
因此$.ajax
调用那些缓存的结果,然后使用setTimeout
伪造所需的异步回调。
$.ajax
调用完成,一旦浏览器重新进入其事件处理循环,它就会找到(立即过期的)定时器事件并调用其回调。
答案 1 :(得分:2)
原因是setTimeout将函数添加到浏览器事件队列中,因此只有在处理完队列中的前面事件后才会调用它,允许设置超时的函数的其余部分完成执行。