美文网首页
同步请求和GUI渲染阻塞问题

同步请求和GUI渲染阻塞问题

作者: 喵呜Yuri | 来源:发表于2019-05-09 16:08 被阅读0次

在jquery中ajax请求一半情况下使用异步执行,单有时也会又特殊需求使用同步,此时如果想要诸如显示loading等待框,执行请求,关闭loading等待框时就会出现问题。首先loading等待框居然不出现,
原因是这样的:
原因就是ajax的async设置为true时,ajax会委托浏览器另起一个线程,此线程与js线程和ui线程不冲突,只是在执行完成后再插入js事件环。而ajax的async设置为false时并没有启动单独的线程,还是在js主线程中执行,所以会与浏览器的渲染(UI)线程和js线程是互斥的,在执行js耗时操作时,页面渲染会被阻塞掉。当我们执行异步ajax的时候没有问题,但当设置为同步请求时,其他的动作(ajax函数后面的代码,还有渲染线程)都会停止下来。即使我的DOM操作语句是在发起请求的前一句,这个同步请求也会“迅速”将UI线程阻塞,不给它执行的时间。这就是代码失效的原因。

这时使用settimeout也是不可行的,因为setTimeout并不是异步的,而是将其操作插入到js线程中,排队执行,造成异步的假象。
正确的解决方法是使用#######deferred
举个简单的小例子
使用前:

function toGetData() {
       var defer = $.Deferred();
       $.ajax({
           url: ' https://api.itooi.cn/music/tencent/search?key=579621905&s=123&limit=10&offset=0&type=song',
           type: "get", // 请求类型
           dataType: 'json',
           async: true, // 是否异步
           success: function (ret) {
              console.log('2');
           }
       });
       return defer;
   }
  $('button').click(function(){
       $(".shadow").show()
       console.log('1');
       toGetData();
       console.log('3');
   })

依次输出1,3,2
使用后:

    function toGetData() {
        var defer = $.Deferred();
        $.ajax({
            url: ' https://api.itooi.cn/music/tencent/search?key=579621905&s=123&limit=10&offset=0&type=song',
            type: "get", // 请求类型
            dataType: 'json',
            async: true, // 是否异步
            success: function (ret) {
               console.log('2');
                defer.resolve(ret)
            }
        });
        return defer;
    }
    $('button').click(function(){
        $(".shadow").show()
        console.log('1');
        $.when(toGetData()).done(function(ret){
            $(".shodow").hide();
            console.log('3');
        });
    })

依次输出1,2,3

相关文章

  • 同步请求和GUI渲染阻塞问题

    在jquery中ajax请求一半情况下使用异步执行,单有时也会又特殊需求使用同步,此时如果想要诸如显示loadin...

  • 网络知识点回顾一

    同步请求和异步请求- 同步请求:阻塞式请求,会导致用户体验的中断- 异步请求:非阻塞式请求,不中断用户体验,百度地...

  • 线程安全的实现方法(2)---非阻塞同步

    上文说到了线程安全的互斥同步实现方法,这里说一下非阻塞同步。 非阻塞同步 互斥同步的主要问题是线程阻塞和唤醒所带来...

  • 谈论:同步异步阻塞非阻塞.md

    同步/异步:关注的方式(是否主动) 阻塞/非阻塞: 同步阻塞BIO: 同步非阻塞NIO: 异步非阻塞: 异步阻塞:

  • UNIX 的5种IO模型介绍

    IO模型同步、异步、阻塞、非阻塞socket阻塞与非阻塞,同步与异步 同步和异步 同步/异步主要针对C端-同步就像...

  • 同步与异步 阻塞与非阻塞

    对同步阻塞、同步非阻塞、异步非阻塞这些名词一直混淆不清,虽然在日常的开发中经常接触到这些概念,比如ajax的异步请...

  • I/O系列篇(三)JDK原生NIO(非阻塞式I/O)

    一、模型说明 1、NIO解决的BIO的核心问题 客户端连接的同步阻塞问题 读写操作的同步阻塞问题 2、NIO服务端...

  • BIO NIO AIO

    BIO:同步阻塞IONIO:同步非阻塞IOAIO:异步非阻塞IO先弄清楚同步、异步,阻塞、非阻塞概念。 io操作分...

  • IO模型

    原文参考链接 四种状态 同步 异步 阻塞 非阻塞 IO分类 同步阻塞IO 同步非阻塞IO 异步非阻塞IO注意: 没...

  • 【浏览器】为什么 Javascript 要是单线程的 ?

    概要: 1.js为单线程:因为多线程会导致DOM操作冲突; 2. js阻塞页面加载:GUI 渲染线程与 JavaS...

网友评论

      本文标题:同步请求和GUI渲染阻塞问题

      本文链接:https://www.haomeiwen.com/subject/skfwoqtx.html