ajax异步模式下实现等待loading(jQuery同步Ajax带来的UI线程阻塞问题及解决办法)
2016-11-25 14:47
791 查看
在与后台实现数据交互时经常会遇到一种这样的情况:
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); // 执行其他代码 }); });
相关链接:
http://www.cnblogs.com/lvdabao/p/3744030.html
http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html
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); // 执行其他代码 }); });
相关链接:
http://www.cnblogs.com/lvdabao/p/3744030.html
http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html
相关文章推荐
- 详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
- jQuery同步Ajax带来的UI线程阻塞问题及解决办法
- jQuery同步Ajax带来的UI线程阻塞问题及解决办法
- jQuery同步Ajax带来的UI线程阻塞问题及解决办法
- jQuery同步Ajax带来的UI线程阻塞问题及解决方法
- jQuery同步Ajax带来的UI线程阻塞问题及解决方法
- 0顶 jQuery同步Ajax带来的UI线程阻塞问题及...
- 利用jquery实现Ajax技术,post方式传值中文乱码问题的解决办法。
- jquery异步ajax超大长度base64图片长字段数据传输问题解决办法和php后台处理办法
- jQuery同步Ajax带来的UI线程阻塞问题及解决办法
- jQuery同步Ajax带来的UI线程阻塞问题及解决办法
- 【jQuery】解决在循环中使用ajax异步时,数据的同步问题
- jQuery同步Ajax带来的UI线程阻塞问题及解决办法
- AJAX是什么? AJAX的交互模型(流程)?同步和异步的区别? AJAX跨域的解决办法?
- MVC5 新建项目里不包含jquery.unobtrusive-ajax.js(MVC5异步表单的问题)解决方法
- AJAX是什么?AJAX的交互模型(流程)?同步和异步的区别?AJAX跨域的解决办法?
- 关于解决jquery用get实现ajax在ie里面刷新不进入后台的问题
- (Jquery解决篇) Ajax异步请求 (Eval函数)问题
- 关于ajax同步与异步的实现问题
- 解决JQuery表单异步提交到action的乱码问题(ajaxform,ajaxsubmit)