首页 > 异步操作在火狐和chrome上的执行差异问题。

异步操作在火狐和chrome上的执行差异问题。

(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秒。

【热门文章】
【热门文章】