jquery ajax setTimeout 0 ms

时间:2012-08-22 13:03:21

标签: jquery ajax

  

可能重复:
  Why does setTimeout(fn, 0) sometimes help?

阅读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;

2 个答案:

答案 0 :(得分:3)

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

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

因此$.ajax调用那些缓存的结果,然后使用setTimeout伪造所需的异步回调。

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

答案 1 :(得分:2)

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