【问题标题】:jquery ajax setTimeout 0 ms [duplicate]jquery ajax setTimeout 0 ms [重复]
【发布时间】:2012-08-17 21:58:57
【问题描述】:

可能重复:
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;

【问题讨论】:

  • @Strelok 并不是真正的重复恕我直言,尽管它是相关的。在这种情况下,需要维护与程序员的功能合同,而不是解决任何特定问题。
  • 啊,其实是为了解决IE6/7的一个特性

标签: jquery ajax


【解决方案1】:

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

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

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

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

【讨论】:

  • 所以不做setTimeout,当前(执行?)函数将停止执行回调()?当您说当前函数时,是指包含 if 语句的函数(即 #send() )
  • @portoalet 我几乎完全重写了这个答案以使其更清晰。
  • 在阅读 john resig 文章 ejohn.org/blog/how-javascript-timers-work987654321@ 后更有意义
【解决方案2】:

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

【讨论】:

  • “从执行队列中移除函数”是什么意思?
  • 我不明白为什么要投票。这个所谓的“执行队列”是什么?为什么你认为可以从中删除东西?
  • “执行队列”可能不是我的意思的最佳表达。我的意思是该函数是异步调用的,并且必须等到下一个可能的执行点,以允许当前函数完成。也许调用队列是更好的表达方式
  • 如果你写的是“事件队列”而不是“执行队列”,那将是有意义的,除非setTimeout 不可能从事件队列。
  • 由于试图太快而导致配方不佳。我改写了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多