1

可能重复:
为什么 setTimeout(fn, 0) 有时会有所帮助?

阅读 jQuery 1.8 源码,

为什么它以 0 ms 延迟执行 setTimeout ?(而不仅仅是执行回调?)

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;
4

2 回答 2

3

这是针对 IE6 和 IE7 的特性的一种解决方法,它可以从缓存中检索 AJAX 结果而无需触发XMLHTTPRequest回调,而是立即将其readyState属性设置为4

然而,API 契约$.ajax要求它立即返回异步请求(即不调用程序员提供的回调)。

因此$.ajax,对这些缓存结果调用测试,然后使用setTimeout.

调用完成,$.ajax一旦浏览器重新进入它的事件处理循环,它就会找到(立即过期的)定时器事件并调用它的回调。

于 2012-08-22T13:06:28.120 回答
2

原因是 setTimeout 将该函数添加到浏览器事件队列中,因此只有在队列中的前面事件处理完毕后才会调用它,从而允许设置超时的函数的其余部分完成执行。

于 2012-08-22T13:05:34.583 回答