(function () {
console.time('ajax');
console.time('sync');
console.time('setTimeout');
$.post('../ajax1.php').done(function (data) {
// ajax后台sleep(2);
console.timeEnd('ajax'); // Firefox:5080.77ms Chrome:3056.377ms
console.log(data);
});
setTimeout(function () {
console.log('settimeout');
console.timeEnd('setTimeout'); // Firefox:3090.22ms Chrome:3075.073ms
}, 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'); // Firefox:3010.58ms Chrome:3004.031ms
})();
在谷歌v8是对的,也是自己预想的结果,为什么在火狐下执行结果大相径庭,是代码的问题,还是我本地的火狐设置问题,还是浏览器本身解释器的问题呢?
你之前提问的问题我也回答了。
我觉得,Ajax请求是马上发起(如Chrome)还是在当前执行栈空了以后再发起(如Firefox)都可以,是浏览器自己如何实现的问题。
但是真正符合异步过程精神的应该是Chrome那样的(即Ajax线程不应该被主线程阻塞)。Firefox的实现很奇怪!
请参考我刚写的一篇文章:JavaScript:彻底理解同步、异步和事件循环(Event Loop)
好吧,首先setTimeout的原因你应该是知道的,主要是你写的这个sleep函数实际一直在占用主线程,导致没有机会检测定时器是否到时,建议引入setTimeout(function, 0);
另外ajax的工作应该是另一个线程中进行的,但是浏览器间的实现不一定一致,有些会有优化行为,建议你打开浏览器的时间线录制功能,可以看到某些浏览器下,ajax并没有立刻发起,还是等待3秒后才发起的,然后加上服务器端耗时等,为5秒。