• ajax 多个setInterval进行ajax请求的页面长时间打开会出现页面卡死问题


     多个setInterval进行ajax请求的页面长时间打开会出现页面卡死问题

     

    浏览器的渲染(UI)线程和js线程是互斥的,在执行js耗时操作时,页面渲染会被阻塞掉。当我们执行异步ajax的时候没有问题,但当设置为同步请求时,其他的动作(ajax函数后面的代码,还有渲染线程)都会停止下来。即使DOM操作语句是在发起请求的前一句,这个同步请求也会“迅速”将UI线程阻塞,不给它执行的时间。这就是代码失效的原因。

    方案一:

    setInterval会消耗网页内存,如果不清理会一直消耗直到网页卡死。

    解决办法:

    先清除定时器再创建一个定时器

    clearInterval(t);

    t=setInterval(ajax,10000);

    方案二:(等价于同步)

    使用JQuery Deferred对象。
    var getWordCount = function(。。。){
            var defer = $.Deferred();
            var urlStr = "postcommit.html?I_SOURCE=getxliff";
            $.ajax({
                url : urlStr,             //async : false,表示异步执行。
                success: function(dataStr){
                          defer.resolve(dataStr);
                }
            });        
            return defer.promise();
       }

    var myTotalprice = function(。。。){
                               //当getWordCount() 执行完成后,执行done()以下操作。就跟同步效果一样。
                              $.when(getWordCount(。。。)).done(function(dataStr){
                                           alert(dataStr);
                               });                   
       }

    方案三:

    参考地址:https://www.jianshu.com/p/55448bc08961

    使用web worker:

    var worker = new Worker('worker.js');//必须是同域的

    worker.postMessage(msg);//主页面向worker发消息。msg可以是对象,字符串之类。

    onmessage = function(evt) {// 处理主页面发来的消息
        postMessage('reveive data ' + evt.data + 'from page');// 向主页面发消息
    }

    worker.terminate();

    方案四:

    长连接方式实现:xmlhttp池

  • 相关阅读:
    scapy-python
    多进程和多线程
    Python函数
    while循环
    打印print的另一种方式sys.stdout
    python3 pickle & struct
    正则表达式
    【牛客网刷题】两种排序方法
    使用Python matplotlib做动态曲线
    【牛客网刷题】一次难忘的编程教训
  • 原文地址:https://www.cnblogs.com/zlp520/p/9292079.html
Copyright © 2020-2023  润新知