手机版

了解jQuery的承诺的具体用法

时间:2021-09-03 来源:互联网 编辑:宝哥软件园 浏览:

之前已经知道了ES6的Promise对象,我们再来看看jQuery中的Promise,它是jQuery的delivered对象。

首先打开浏览器控制台。

脚本var defer=$。递延();console.log(延期);/脚本运行结果:

它看起来有点像ES6的Promise对象。jQuery的延迟对象也有解析、拒绝、然后方法,以及完成、失败,总是.JQuery使用这个delivered对象注册异步操作的回调函数,修改并传递异步操作的状态。

延迟播放:

脚本函数runAsync(){ var defer=$。递延();//做一些异步操作settimeout(function(){ console . log('执行完成'));Defer.resolve('异步请求成功后返回的数据');}, 1000);返回延期;} runAsync()。然后(function(data){ console . log(data)});/script运行后,delay对象的实例delay将参数“异步请求成功后返回的数据”传递回接收、打印的方法。

类似于ES6的承诺,但有一点不同,再看看承诺:

脚本函数runasync () {var p=newpromise(函数(解析,拒绝){settimeout(函数(){console.log('执行完成'));解析(“成功的异步请求后返回的数据”);}, 1000);});返回p;} runAsync()。然后(函数(数据){ console.log(数据);});/script我们发现:

1.创建延迟对象时,没有传递任何参数;创建Promise对象时,传递了参数(传递了一个匿名函数,该函数还有两个参数:resolve和reject);

2.延迟对象直接调用解析方法;而Promise对象是内部调用的解析方法;

注意:延迟对象本身有一个解析方法,而Promise对象通过在构造函数中执行解析方法将执行结果的状态分配给Promise对象。

这有一个缺点:因为delivered对象附带了一个resolve方法,在获得delivered对象之后,您可以随时调用resolve方法,并且可以手动干预它的状态

脚本函数runAsync(){ var defer=$。递延();//做一些异步操作settimeout(function(){ console . log('执行完成'));Defer.resolve('异步请求成功后返回的数据');}, 1000);返回延期;} var der=RunAsync();der . then(function(data){ console . log(data)});Der.resolve('外部结束');/script在这种情况下,直接在外部设置delivered的状态,打印“外部结束”,1s后打印“执行完成”,不打印“异步请求成功后返回的数据”。

显然,这不好。我发送一个异步请求,让人们在接收数据之前在外面完成。

当然,jQuery肯定会填这个坑。延迟对象有一个承诺方法,它是一个有限的延迟对象

脚本函数runAsync(){ var def=$。递延();//做一些异步操作settimeout(function(){ console . log('执行完成'));Def.resolve('成功请求后返回的数据');}, 2000);return def . promise();//在此调用}/脚本。所谓的受限延迟对象是没有解析和拒绝方法的延迟对象。这使得无法在外部更改延迟对象的状态。

延迟对象的方法和完成和失败的语法糖

我们知道,在ES6的Promise规范中,then方法接受两个参数,即执行完成和执行失败的回调,jquery被增强为接受第三个参数,即处于挂起状态的回调,如下所示:

delivered . then(DoneFilter[,failFilter ] [,ProgreSFilter])

然后方法:

脚本函数runAsync(){ var def=$。递延();//做一些异步操作settimeout(function(){ varnum=math . ceil(math . random()* 10);//如果(num=5){ def.resolve(num)从1到10,则生成一个随机数;} else{ def.reject('数字太大');} }, 2000);return def . promise();//调用} runasync()。然后(函数(d) {console.log ('resolve ')在这里;console . log(d);},函数(d){ console . log(' reject ');console . log(d);})/script delivered对象的then方法也可以被链接。

Done,fail语法sugar,用于分别指定执行完成和执行失败的回调,相当于这段代码:

脚本函数runAsync(){ var def=$。递延();//做一些异步操作settimeout(function(){ varnum=math . ceil(math . random()* 10);//如果(num=5){ def.resolve(num)从1到10,则生成一个随机数;} else{ def.reject('数字太大');} }, 2000);return def . promise();//调用} runasync()。done(函数(d) {console.log ('resolve ')在此处;console . log(d);}).失败(函数(d){ console . log(' reject ');console . log(d);})的用法/scriptalways

jquery的delivered对象上还有一个always方法,不管执行完成与否,它总是会执行,这类似于ajax中的complete。

$的用法。当.的时候

在jquery中,还有一个$。when方法实现Promise,与ES6中的all方法函数相同,并行执行异步操作,然后在执行完所有异步操作后执行回调函数。然而,$。在$ . delivered中没有定义何时。从名称中可以看出$。当是单独的方法时。与ES6的all参数略有不同,它接受多个延迟对象而不是数组,如下所示:

脚本函数runAsync(){ var def=$。递延();//做一些异步操作settimeout(function(){ varnum=math . ceil(math . random()* 10);//生成1-10的随机数def . resolve(num);}, 2000);return def . promise();//调用} $。when (runasync()、runasync()、runasync())。然后(函数(data1,data2,data3) {console.log('所有执行完成');console.log(data1、data2、data 3);});在/scriptjquery中没有像在ES6中那样的race方法吗?是跑得快的方法。没错,它不在jquery中。

这些是jquery中延迟对象的常见方法。

在前一篇文章和本文中,使用一次性计时器代替异步请求进行数据处理。为什么没有使用ajax,不是因为麻烦,这里我们应该谈谈ajax和delivered之间的联系:

Jquery的ajax返回一个受限的delivered对象,即没有resolve方法和reject方法,状态不能从外部改变。由于它是一个延迟对象,ajax也可以用于我们上面提到的所有功能。例如,链调用,连续发送多个请求:

scriptreq1=function(){ return $。Ajax(/* * * * * * */);}req2=function(){ return $。Ajax(/* * * * * * */);}req3=function(){ return $。Ajax(/* * * * * * */);} req1()。然后(req2)。然后(req3)。done (function () {console.log('请求已发送');});/script成功、错误和完成

这三种方法都是常用的ajax语法糖。

$.Ajax (/*.*/).成功(函数(){/*.*/}).错误(函数(){/*.*/}).复数(函数(){/*.*/})有时更倾向于在内部作为属性处理

回调分别指示ajax请求的成功、失败和结束。这三种方法和delivered有什么关系?其实是语法糖,成功对应完成,错误对应失败,完成对应始终,就是为了和ajax的参数名保持一致。

总结:

$.延迟实现了Promise规范,然后,完成、失败和总是延迟对象的方法。$.when是一个全局方法,用于并行运行多个异步任务,是ES6的all的函数。Ajax返回一个受限的延迟对象。成功、错误和完整是ajax提供的语法糖,它们的功能与done、fail和delivered object的功能一致。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:了解jQuery的承诺的具体用法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。