ajax异步模式下实现同步和等待loading效果(jQuery同步Ajax带来的UI线程阻塞问题及解决办法)

ajax异步模式下实现同步和等待loading效果(jQuery同步Ajax带来的UI线程阻塞问题及解决办法)
在与后台实现数据交互时经常会遇到一种这样的情况:

1.需要用一个ajax请求后台数据,并且要在获取到数据之后再渲染到页面,这个时候就必须用同步(async:false)。

2.然而在这个时候就会有另一种情况,当ajax的请求花费的时间比较长的时候需要一个loading层来显示等待状态

3.这个时候beforeSend是没有效果的,即使把loading的代码写在ajax之前也不行。

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

5.解决方法使用jquery的.Deferred()和.when().done()来实现异步下达到同步执行的效果(注意:是在异步下实现的)

function getAjaxData() {
 
    var defer = $.Deferred();
 
    $.ajax({
        url: '',
        type: 'post',
        data: '',
        async: true,
        dataType: 'json',
        success: function (data) {
            defer.resolve(data);
        }
    });
 
    return defer;
}
 
 
// 执行
$('#id').click(function () {
 
    showLoading(); // 显示等待图标
 
    $.when(getAjaxData()).done(function (data) {
 
        closeLoading(); // 隐藏等待图标
 
        console.log(data);
        // 执行其他代码
    });
});

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 吃饭早饭发现快十点了。然后洗碗,把攒了一个星期的内裤洗了,还没来得及晾,爸爸就开始抱怨妈妈怎么还没好。并且抱着老小...
    学会取悦自己阅读 383评论 0 0
  • 学写作,首先要学会的就是笔耕不辍。 坚持日更真的不是一件容易的事,已经坚持日更50多天了,从最开始兴致勃勃地写读书...
    幽兰茶屋阅读 149评论 0 0
  • 早安啊。室友仍旧没有起床,本来想着出去看书,可是已到图书馆就打瞌睡呢!但在寝室学习又会打扰到正在睡觉的室友。而且不...
    带一人回云深不知处阅读 192评论 0 0
  • 有一个地方 打开流量也没有网络 那是我的心上 有了小船 也不能划浆 有一个地方 盛满了也还在空虚 那是我的心上 抓...
    江城妖怪阅读 216评论 2 0

友情链接更多精彩内容