jquery ajax设置超时0毫秒

jquery ajax设置超时0毫秒,jquery,ajax,Jquery,Ajax,可能重复: 阅读jQuery 1.8源代码 为什么它会以0毫秒的延迟设置超时? (而不仅仅是执行回调?) 原因是setTimeout将该函数添加到浏览器事件队列中,因此只有在处理队列中前面的事件后才会调用该函数,允许设置超时的函数的其余部分完成执行。原因是setTimeout将函数添加到浏览器事件队列中,因此只有在处理队列中前面的事件后才会调用该函数,允许设置超时以完成执行的函数的其余部分。这是IE6和IE7特性的一个变通方法,IE6和IE7可以从缓存中检索AJAX结果,而无需启动XMLHT

可能重复:

阅读jQuery 1.8源代码

为什么它会以0毫秒的延迟设置超时? (而不仅仅是执行回调?)


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

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

这是IE6和IE7特性的一个变通方法,IE6和IE7可以从缓存中检索AJAX结果,而无需启动
XMLHTTPRequest
回调,立即将其
readyState
属性设置为
4

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

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


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

这是IE6和IE7特性的一种变通方法,它可以从缓存中检索ajax结果,而无需触发
XMLHTTPRequest
回调,立即将其
readyState
属性改为
4

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

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


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

从执行队列中删除函数是什么意思?我不明白为什么会这样做。这个所谓的“执行队列”是什么?为什么您认为可以从中删除内容?“执行队列”可能不是我所指的最佳表达方式。我的意思是,该函数是异步调用的,必须等到下一个可能的执行点,允许当前函数完成。也许调用队列是一种更好的表达方式,如果您编写的是“事件队列”而不是“执行队列”,那么这种表达方式会有一定的意义,只是
setTimeout
不可能从事件队列中删除某些内容。由于试图太快,因此表达方式不好。我换了一种说法,“从执行队列中删除函数”是什么意思?我不明白为什么会这样。这个所谓的“执行队列”是什么?为什么您认为可以从中删除内容?“执行队列”可能不是我所指的最佳表达方式。我的意思是,该函数是异步调用的,必须等到下一个可能的执行点,允许当前函数完成。也许调用队列是一种更好的表达方式,如果您编写的是“事件队列”而不是“执行队列”,那么这种表达方式会有一定的意义,只是
setTimeout
不可能从事件队列中删除某些内容。由于试图太快,因此表达方式不好。因此,如果不执行setTimeout,当前(正在执行?)函数将停止以执行callback()?当你提到current function时,是指包含if语句(即#send())@portoalet的函数吗?我几乎完全重写了这个答案,试图让它更清楚。在阅读john resig的文章后,这更有意义,因此在不执行setTimeout的情况下,current(executing?)函数将停止执行callback()?当你说当前函数时,是不是指包含if语句(即#send())@portoalet的函数?我几乎完全重写了这个答案,试图让它更清楚。阅读john resig的文章后,这更有意义@Strelok实际上不是一个重复的IMHO,尽管它是相关的。在这种情况下,需要维护与程序员的功能契约,而不是解决任何特定问题。啊,实际上是解决IE6的一个特性/7@Strelok不是一个真正的复制IMHO,尽管它是相关的。在这种情况下,需要维护与程序员的功能契约,而不是解决任何特定问题。啊,实际上是解决IE6/7的一个特性
                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;