(function () {
console.time('ajax');
console.time('sync');
console.time('setTimeout');
$.post('../ajax1.php').done(function (data) {
// ajax后台sleep(2);
console.timeEnd('ajax'); // 5080.77ms
console.log(data);
});
setTimeout(function () {
console.log('settimeout');
console.timeEnd('setTimeout'); // 3090.22ms
}, 2000);
function sleep(miliSeconds) {
var data = new Date().getTime();
var getNowTime = function () {
return new Date().getTime();
}
while ( getNowTime() < (data + miliSeconds) );
}
// 执行栈延迟3秒后执行
sleep(3000);
console.timeEnd('sync'); // 3010.58ms
})();
从执行的时间来看,setTimeout
和ajax
还是有区别的。
我理解中的ajax的回调函数也应该在执行栈(3000mm)后开始执行回调函数(因为ajax后台也是延时2秒),也就是说ajax的时间也应该是在3000mm左右,然而现实却不是这样,是我理解错了么?请理解的同学帮我指正一下。
update0:我认为setTimeout执行是对的,而上面的ajax执行是有问题的,请大大们指正
update1:我上面的测试是在火狐浏览器运行的,所以返回了错误的结果,在谷歌浏览器下则是正常的。郁闷,森么情况。。
题主,我对你的结果表示怀疑!
下面是我测试的结果:
(1) 首先,我用Node.js写了一个简单的后台,它会延迟2秒返回响应。代码如下:
(2) 为了证明有效,首先在没有堵塞时做如下验证:
也就是说延迟为2秒左右。这证明了我写的后台确实使响应延迟了2秒。
另外,有截图为证:
(3) 然后加上堵塞,堵塞时间为3000毫秒:
也就是说延迟为3秒左右,而不是你描述的5秒左右。
此处也有截图为证:
(4) 根据以上结果,
block
并没有堵塞ajax的异步过程,与setTimeout的情况相同。我不知道你的结果是怎么回事啊。。。