javascript - 异步操作在火狐和chrome上的执行差异问题。
PHP中文网
PHP中文网 2017-04-10 16:52:23
[JavaScript讨论组]
(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是对的,也是自己预想的结果,为什么在火狐下执行结果大相径庭,是代码的问题,还是我本地的火狐设置问题,还是浏览器本身解释器的问题呢?

PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
怪我咯

好吧,首先setTimeout的原因你应该是知道的,主要是你写的这个sleep函数实际一直在占用主线程,导致没有机会检测定时器是否到时,建议引入setTimeout(function, 0);

另外ajax的工作应该是另一个线程中进行的,但是浏览器间的实现不一定一致,有些会有优化行为,建议你打开浏览器的时间线录制功能,可以看到某些浏览器下,ajax并没有立刻发起,还是等待3秒后才发起的,然后加上服务器端耗时等,为5秒。

大家讲道理

你之前提问的问题我也回答了。
我觉得,Ajax请求是马上发起(如Chrome)还是在当前执行栈空了以后再发起(如Firefox)都可以,是浏览器自己如何实现的问题。

但是真正符合异步过程精神的应该是Chrome那样的(即Ajax线程不应该被主线程阻塞)。Firefox的实现很奇怪!

请参考我刚写的一篇文章:JavaScript:彻底理解同步、异步和事件循环(Event Loop)

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号