当前位置: 首页 > news >正文

连云港网站建设方案/西安企业seo外包服务公司

连云港网站建设方案,西安企业seo外包服务公司,网络组建与维护论文,买2g 空间做下载网站先前了解了ES6的Promise对象&#xff0c;来看看jQuery中的Promise&#xff0c;也就是jQuery的Deferred对象。 打开浏览器的控制台先。 <script>var defer $.Deferred();console.log(defer); </script> 运行代码 运行结果&#xff1a; 和ES6的Promise对象长的有点像…

先前了解了ES6的Promise对象,来看看jQuery中的Promise,也就是jQuery的Deferred对象。

打开浏览器的控制台先。

<script>var defer = $.Deferred();console.log(defer);
</script>

运行代码

运行结果:

和ES6的Promise对象长的有点像,jQuery的Deferred对象也有resolve、reject、then方法,还有done、fail、always......方法。jQuery就是用这个Deferred对象来注册异步操作的回调函数,修改并传递异步操作的状态。

玩玩Deferred:

<script>function runAsync(){var defer = $.Deferred();//做一些异步操作
        setTimeout(function(){console.log('执行完成');defer.resolve('异步请求成功之后返回的数据');}, 1000);return defer;}runAsync().then(function(data){console.log(data)});
</script>

运行代码

 运行之后,Deferred对象的实例defer通过resolve方法把参数 “异步请求成功之后返回的数据” 传回到then方法中进行接收,,打印。

和ES6的Promise相似,但是有一点点区别,再看下Promise:

<script>function runAsync(){var p = new Promise(function(resolve, reject){setTimeout(function(){console.log('执行完成');resolve('异步请求成功之后返回的数据');}, 1000);});return p;            }runAsync().then(function(data){console.log(data);});
</script>

运行代码

我们发现:

1、创建Deferred对象的时候没有传参;而创建Promise对象的时候,传了参数(传了一个匿名函数,函数也有两个参数:resolve、reject);

2、Deferred对象直接调用了resolve方法;而Promise对象则是在内部调用的resolve方法;

说明:Deferred对象本身就有resolve方法,而Promise对象是在构造器中通过执行resolve方法,给Promise对象赋上了执行结果的状态。

这样就有一个弊端:因为Deferred对象自带resolve方法,拿到Deferred对象之后,就可以随时调用resolve方法,其状态可以进行手动干预了

<script>function runAsync(){var defer = $.Deferred();//做一些异步操作
        setTimeout(function(){console.log('执行完成');defer.resolve('异步请求成功之后返回的数据');}, 1000);return defer;}
  
var der = runAsync();
   der.then(function(data){console.log(data)
   });
   der.resolve('在外部结束'); 
</script>

运行代码

 这样的话就直接在外部直接给Deferred设置了状态,打印“在外部结束”,1s后打印“执行完成”,不会打印“异步请求成功之后返回的数据”了。

显然,这不好。我发个异步请求,还没收到数据就让人在外部给我结束了。。。。。。。

当然这个坑jQuery肯定会填的,在Deferred对象上有一个promise方法,是一个受限的Deferred对象

<script>function runAsync(){var def = $.Deferred();//做一些异步操作
        setTimeout(function(){console.log('执行完成');def.resolve('请求成功之后返回的数据');}, 2000);return def.promise(); //就在这里调用
    }
</script>

所谓受限的Deferred对象,就是没有resolve和reject方法的Deferred对象。这样就无法在外边改变Deferred对象的状态了。

Deferred对象的then方法和done、fail语法糖

我们知道,在ES6的Promise规范中,then方法接受两个参数,分别是执行完成和执行失败的回调,而jquery中进行了增强,还可以接受第三个参数,就是在pending状态时的回调,如下:

deferred.then( doneFilter [, failFilter ] [, progressFilter ] )

then方法

<script>function runAsync(){var def = $.Deferred();//做一些异步操作
        setTimeout(function(){var num = Math.ceil(Math.random()*10); //生成1-10的随机数if(num<=5){def.resolve(num);}else{def.reject('数字太大了');}}, 2000);return def.promise(); //就在这里调用
    }runAsync().then(function(d){console.log("resolve");console.log(d);},function(d){console.log("reject");console.log(d);})</script>

运行代码

Deferred对象的then方法也是可以进行链式操作的。

done,fail语法糖,分别用来指定执行完成和执行失败的回调,与这段代码是等价的:

<script>function runAsync(){var def = $.Deferred();//做一些异步操作
        setTimeout(function(){var num = Math.ceil(Math.random()*10); //生成1-10的随机数if(num<=5){def.resolve(num);}else{def.reject('数字太大了');}}, 2000);return def.promise(); //就在这里调用
    }runAsync().done(function(d){console.log("resolve");console.log(d);}).fail(function(d){console.log("reject");console.log(d);})</script>

运行代码

always的用法

jquery的Deferred对象上还有一个always方法,不论执行完成还是执行失败,always都会执行,有点类似ajax中的complete。

$.when的用法

jquery中,还有一个$.when方法来实现Promise,与ES6中的all方法功能一样,并行执行异步操作,在所有的异步操作执行完后才执行回调函数。不过$.when并没有定义在$.Deferred中,看名字就知道,$.when,它是一个单独的方法。与ES6的all的参数稍有区别,它接受的并不是数组,而是多个Deferred对象,如下:

<script>function runAsync(){var def = $.Deferred();//做一些异步操作
        setTimeout(function(){var num = Math.ceil(Math.random()*10); //生成1-10的随机数def.resolve(num);   }, 2000);return def.promise(); //就在这里调用
    }$.when(runAsync(), runAsync(), runAsync()) .then(function(data1, data2, data3){
     console.log('全部执行完成');
     console.log(data1, data2, data3);
  });
</script>

运行代码

jquery中没有像ES6中的race方法吗?就是以跑的快的为准的那个方法。对的,jquery中没有。
以上就是jquery中Deferred对象的常用方法了。
在上一篇和本篇当中,都是用一次性定时器来代替了异步请求进行数据处理。为什么没用ajax呢,不是因为麻烦,在这里要说一下ajax和Deferred的联系:
jquery的ajax返回一个受限的Deferred对象,也就是没有resolve方法和reject方法,不能从外部改变状态,既然是Deferred对象,那么我们上面讲到的所有特性,ajax也都是可以用的。比如链式调用,连续发送多个请求:
<script>
req1 = function(){return $.ajax(/* **** */);
}
req2 = function(){return $.ajax(/* **** */);
}
req3 = function(){ return $.ajax(/* **** */);
}
req1().then(req2).then(req3).done(function(){ console.log('请求发送完毕'); });
</script>

success、error与complete

这三个方法是我们常用的ajax语法糖。

$.ajax(/*...*/)
.success(function(){/*...*/})
.error(function(){/*...*/})
.complete(function(){/*...*/})

有时候比较喜欢在内部作为属性来处理。

分别表示ajax请求成功、失败、结束的回调。这三个方法与Deferred又是什么关系呢?其实就是语法糖,success对应done,error对应fail,complete对应always,就这样,只是为了与ajax的参数名字上保持一致而已。

总结:

$.Deferred实现了Promise规范,then、done、fail、always是Deferred对象的方法。$.when是一个全局的方法,用来并行运行多个异步任务,与ES6的all是一个功能。ajax返回一个受限的Deferred对象,success、error、complete是ajax提供的语法糖,功能与Deferred对象的done、fail、always一致。

转载于:https://www.cnblogs.com/yinn/p/7607863.html

http://www.lbrq.cn/news/740395.html

相关文章:

  • 专业做网站建/如何自己建设网站
  • 网站开发毕业设计源码/地推拉新app推广怎么做
  • 可以做立体图形的网站/怎样看网页的友情链接
  • 企业官方网站的作用/网页制作用什么软件做
  • 百度不收录网站关键词/大数据营销系统多少钱
  • 招聘网站可以做两份简历吗/企业网站快速建站
  • 如何重装一下wordpress/seocms
  • 手机版网站怎样做推广/南宁一站网网络技术有限公司
  • wordpress机械行业模板/网站内容优化怎么去优化呢
  • 平台骗了钱/长沙seo管理
  • 网站和app设计区别/网络营销策划书1500字
  • 河北网站建设备案价格/企业网站建设原则是
  • 从手机上可以做网站吗/公众号推广方法
  • 道路建设网站专题/免费关键词排名优化
  • 深圳建站公司招聘/外贸营销网站怎么建站
  • 淘宝客网站怎么做的/微信crm系统
  • 莱芜找工作网站/2345网址中国最好
  • 建设事业单位网站多少钱/推广普通话手抄报内容怎么写
  • 茶叶网站模板/西安seo全网营销
  • 网站设计团队介绍/龙华百度快速排名
  • 国外网站推广/软广告经典例子
  • 欧洲美女网站/今天
  • 做商城网站都需要什么/创建自己的网站
  • 门户网站建设为企业带来的好处/找相似图片 识别
  • 做网站推广的/百度收录入口在哪里查询
  • 温州网站推广站建设/国家职业技能培训平台
  • 在安阳想建个网站怎么做/站长工具seo综合查询网
  • 石家庄网站推广优化/最常用的网页制作软件
  • 网上购物网站建设规划论文/营销推广网站
  • 阿里云网站域名申请/关键词怎么写
  • Altium Designer 22使用笔记(8)---PCB电气约束设置
  • 基于卷积神经网络的多输出数据回归预测CNN(多输入多输出)
  • Go协程:从汇编视角揭秘实现奥秘
  • STM32存储结构
  • cv2.bitwise_and是 OpenCV 中用于执行按位与运算的核心函数,主要用于图像处理中的像素级操作
  • PCL+Spigot服务器+python进行MC编程(使用Trae进行AI编程)---可以生成彩虹