问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何等待JQuery异步全部完成,再执行查询

发布网友 发布时间:2022-05-01 05:18

我来回答

2个回答

懂视网 时间:2022-05-15 08:32

这次给大家带来jquery延迟对象使用案例,jquery延迟对象使用的注意事项有哪些,下面就是实战案例,一起来看一下。

技术一般水平有限,有什么错的地方,望大家指正。

  ES6已经实现了延迟对象Promise,但是今天主角是JQ里面的延迟对象,套路其实都是差不多的。下面先看一个比较牵强的例子:

<button id="add">add</button><button id="remove">remove</button>
<p id="content"></p>
$(function(){
 var dfd = new $.Deferred();
 var add = $("#add");
 var remove = $("#remove");
 var content = $("#content");
 add.click(function(){
 var span = $("<span>我是点击按钮创建的元素</span>");
 $("span").length==0&&$("body").append(span);
 dfd.resolve();
 })
 remove.click(function(){
 var span = $("span");
 span&&span.remove();
 })
 dfd.done(function(){
 $("span").css("color","red");
 })
})

  现在先聚焦功能,我们点击add按钮可以看到span元素添加并且颜色变红。然后在看我们代码中的的异类的东西,开始的var dfd = new $.Deferred();以及add事件函数中的dfd.resolve();还有就是最后面的dfd.done(function(){$("span").css("color","red");})。

  $.Deferred()就是我们今天介绍的重点---JQ中的延迟对象,所谓延迟就是在以后的某段事件可以运行。我们看上面的代码的一个处理流程,在上面的代码中我们调用新建的延迟对象的dfd.done()方法的参数位置传递了一个匿名函数表达式,在点击事件的处理函数执行时调用dfd.resolve(),之后我们写在dfd.done()里面的匿名函数就执行了,在这个过程中我们可以看做,dfd把done里面的函数放在resolve的位置了。dfd就是延迟对象,很明显它可以改变函数的执行顺序。

  在看上面的这段代码你仔细一想就会发现有个毛用啊,我们把改变颜色的代码放在一个函数里面,点击的时候调用这个函数不就好了,写这么麻烦有个鸟用。其实延迟对象最多的是应用在AJAX中。上面的代码我们点击add之后我们在点击remove然后在点击add这时候发现这次的字没有变成红色,这是因为延迟对象的状态变化之后就失效了,说白了就是一次性的。

延迟对象使用

  JQ为我们实现了延迟对象的功能,我们一般称为Deferred或者Promise,基本上是一个东西,确切的说Promise是从Deferred中派生的一个子类。

  我们在使用的时候首先就是创建一个延迟对象:var dfd = new $.Deferred()。

  延迟对象dfd有三种状态分别为pending,resolved,rejected,我们可以通过对dfd对象使用state方法来查看此时的状态:dfd.state()。

  dfd在创建出来之后他的状态为pending,调用resolve方法之后:dfd.resolve()它的状态就会变为resolved然后会执行dfd.done()里面的函数,dfd调用reject方法之后:dfd.reject()它的状体就会变为rejected然后会执行dfd.fail()里面的方法,并且dfd对象在从pending变为resolved或者rejected之后就不会再发生任何变化,这也就是我们上面的代码为什么只能在第一次点击之后的文字是红的的原因。

  我们在来看一看开始的代码,我们的dfd.done()中定义了字体变红的函数,在点击函数执行后dfd调用resolve,之后dfd的状态从pending变为resolved会执行done里面的方法继而颜色变红。

  dfd.resolve()和dfd.done()之间是可以进行参数传递的,现在我们对开始的代码做一些修改:

//done里面的修改如下
dfd.done(function(color){$("span").css("color",color)})
//点击事件的处理函数修改如下
dfd.resolve("green");

  我们在点击之后字体颜色变为绿色了。

  另外dfd还有另外一个函数always:dfd.always(),dfd的状态从pending变为哪个状态always里面的函数都会执行。

  dfd的每一个方法都会返回一个延迟对象,所以done,fail,always都是可以有多个的,可以直接写成链式调用:

dfd.done(function(){}).done(function(){}).fail(function(){});

  dfd的无论哪个API都可以写多个,这时候我们就可能会考虑它的执行顺序能不能保证。这点我们完全可以放心,dfd的函数执行的顺序是完全没有问题的按照我们书写的顺序执行,看下面的代码:

dfd.done(function(){
 var span = $("<span>我是点击按钮创建的元素</span>");
 $("span").length==0&&$("body").append(span);
})
.done(function(color){
 $("span").css("color",color)});
})

  第一个函数添加元素,第二个函数改变添加元素的颜色。

  无论什么时候dfd三个API里面的函数都会在dfd的状态从pending变化之后才能执行,在异步的情况下如此,在同步的情况下也是。更确切的说dfd在调用dfd.resolve()之后已经执行过的done的里面的函数会立即执行,对于dfd.resolve()后面的done来说当程序走到它那时才会执行:

var dfd = new $.Deferred();
dfd.done(function(){console.log(1)});
dfd.done(function(){console.log(2)});
console.log("resolve before");
dfd.resolve();
console.log("resolve after");
dfd.done(function(){console.log(3)});
//resolve before,1,2,resolve after,3

延迟对象示例

  最开始我们使用JQ的AJAX的时候我们通常的写法是:

$.ajax({
 url:"x/y",
 type:"post",
 data:"{...}",
 contentType:"application/json; charset=utf-8",
 success:function(){},
 error:function(){}
})

  在1.5(好像是这个版本~)之后AJAX会返回一个Promise对象,继而我们可以写成下面这种:

$.ajax({
 url:"x/y",
 type:"post",
 data:"{...}",
 contentType:"application/json; charset=utf-8",
}).done(function(){})
.fail(function(){})

  看起来更骚气了一点,而且这我们还可以在加多个.done(function(){}),每个done处理不同的事情这样看起来比较清晰。

  已经知道延迟对象可以改变代码的执行顺序,假如我们又下面的代码:

$.ajax({
 url:"取数据",
 type:"post",
 contentType:"xxx"
}).done(function(data){
 $.ajax({
 url:"利用data取数据",
 data:data,
 type:"post",
 contentType:"xxxx"
 }).done(function(data){
 use data to _do sth...
 })
})

  我们会发现嵌套的有点多了,我们就可以利用延迟对象让他看起来更加好看一点:

var dfd = new $.Deferred();
$.ajax({
 url:"取数据",
 type:"post",
 contentType:"xxx"
}).done(function(data){
 dfd.resolve(data);
})
dfd.done(function(data){
 $.ajax({
 url:"利用data取数据",
 data:data,
 type:"post",
 contentType:"xxxx"
 }).done(function(data){
 use data to _do sth...
 })
})

  没有延迟对象我们一样能完成需要的功能,此时我们就需要一层一层嵌套我们处理过程了,而有了延迟对象我们就可以避免这种事了,他可以轻松控制代码的执行顺序,让代码看起来更请清晰。你可能会说我封装函数在合适的地方调不就行了,如果自己看自己写的代码没问题,但是换一个人他的滚动条可能就一直上上下下了。

  延迟对象的里一个作用就是可以合并AJAX的调用,比如一个接口取数据A另一个接口取数据B,AB都取到之后我们在利用这些数据做一些喜欢做的事,我们就可以利用延迟对象轻松实现。此时我们就可以利用JQ的$.when()来实现。$.when()就跟他的名字一样-当什么的时候-,他的参数可以是Promise对象,也可以是字符串(很少遇到不在介绍),他的返回结果也是一个Promise对象,下面看一个小例子:

 var allData = {};
 var dataA = $.ajax({
 url:"获取A的URL",
 type:"post",
 }).done(function(data){
 allData.a = data;
 });
 var dataB = $.ajax({
 url:"获取B的URL",
 type:"post",
 }).done(function(data){
 allData.b = data;
 });
 $.when(dataA,dataB).done(function(){
 use allData to _do sth...
 });

  allData是保存所有数据的一个集合,dataA是第一个AJAX返回的Promise对象,dataB是第二个。$.when()的done方法执行的唯一条件就是dataA和dataB都执行成功。

  补充:dfd还有一对组合就是notify+progress当dfd对象的状态处于pending时可以调用dfd.nothfy(),调用之后dfd.progress()里面的函数会执行,只要dfd处于pending状态dfd.notify()就可以一直调用,同样也可以传递参数。

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

jQuery版本升级有哪些注意事项

jQuery插件封装步骤详解

热心网友 时间:2022-05-15 05:40

使用$.when(延迟对象1, 延迟对象2).done( function(对象1返回值, 对象2返回值){ ... });

var d1 = $.Deferred();
var d2 = $.Deferred();
 $.when( d1, d2 ).done(function ( v1, v2 ) {
    console.log( v1 ); // "Fish"   
     console.log( v2 ); // "Pizza"
  }); 
 d1.resolve( "Fish" );
 d2.resolve( "Pizza" );

$.when()方法可以接受0个或多个参数, 多个参数用逗号分隔, 这些参数可以是普通对象也可以是延迟对象(包括常用的异步请求),  然后返回一个jquery延迟对象, 可以对其使用then, done, always等方法. 

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
膀胱癌医生要为什么要检查上尿路? 游览器书签怎样添加到手机桌面 玫瑰花是早上开还是晚上开 玫瑰是晚上开花吗 左拾遗是什么官左拾遗的解释 怎样炖羊肉好吃又烂 怎样炖羊肉软烂无膻味好吃 ...之心度君子之腹的意思以小人之心度君子之腹的解释以小人之心度君子... 以小人之心度君子之腹什么意思以小人之心度君子之腹出处介绍 苹果macbook pro开机音乐是什么 苹果台式电脑声音苹果电脑开机声音怎么设置 jQuery中get方法如何在异步的情况下等待请求完成后再执行后面的操作?用... 华强北蓝牙耳机和qcyt5买哪个好? QCY T5蓝牙耳机评测 玩游戏没延迟? 人死后 骨灰是什么形状的? 三角洲特种部队5:黑鹰坠落的游戏攻略 制作贡丸一定要用猪后腿肉? 只有冷冻猪颈肉怎样才可以做好? 手机游戏《七夜》完整版全攻略 石家庄赞皇县市场出现大量冷冻猪后腿肉,合格吗? 冻猪肉标本核酸阳性 求一篇论文“学习祖国的传统文化一点体会”,1500~3000字 最好是自己的心得与体会~~谢谢拉~~ 大家的骑行裤都是怎么洗的 有一天梦里,你大声喊着我也爱你,瞬间炸成了天边的晚霞的意思 电动车控制器怎么检测是否真的坏了? 电动车控制器的大小该怎么去识别,怎么去配电机的大小? win10怎么测试键盘 如何检测电动车控制器的好坏? TI-Nspire进入到“按键测试”模式怎么办? 键盘按键寿命试验机的适用标准 自动敲打的机器或者键盘测试器 键盘按键寿命试验机的工作原理 OPPO T5 蓝牙耳机问题 求设计一饭店招牌。特急!!!定谢!! 想设计一个饭店招牌,急需几个女服务员图片,请帮忙,重谢 即热式电热水龙头用的人多吗?效果怎么样? 一加9pro原厂膜撕掉吗 即热式水龙头它有什么优点 和缺点? 一加8pro贴什么钢化膜合适? 杏仁豆腐吃起来清凉爽口,制作难度大吗? 杏仁能不能和豆腐同食 一加9手机值得等吗?手机出厂有点膜吗? 一加9手机用着好不好用?出厂有自带膜吗? 问吃豆腐和杏仁同时吃是否相克 为什么我做的杏仁豆腐不甜,味道很淡,是糖放少了吗?我是按一下方子来做的,有什么问题吗? 小叶茗轩茶楼改成饭店招牌怎么改 脾虚能吃杏仁,豆腐?豆浆,金针菇吗? 即热式水龙头买哪个牌子的好些? 杏仁豆腐好吃吗? 一加七pro钢化膜跟什么型号通用? 杏仁豆腐怎么做好吃 一加手机新机有贴膜的吗?