阅读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;发布于 2012-08-22 13:06:28
这是IE6和IE7的一个独特之处,它们可以从缓存中检索AJAX结果,而无需触发XMLHTTPRequest回调,而是立即将其readyState属性设置为4。
但是,$.ajax的API契约要求它为异步请求立即返回(即不调用程序员提供的回调)。
因此,对这些缓存的结果进行$.ajax调用测试,然后使用setTimeout伪造所需的异步回调。
$.ajax调用完成,一旦浏览器重新进入其事件处理循环,它将发现(立即过期) timer事件并调用其回调。
发布于 2012-08-22 13:05:34
原因是setTimeout将函数添加到浏览器事件队列中,因此只有在处理队列中的前面事件之后才会调用该函数,从而允许设置超时的函数的其余部分完成执行。
https://stackoverflow.com/questions/12073790
复制相似问题