jQuery的Promise如何正确使用

关于jquery的promise的使用方法,大家了解多少?本文就主要和大家分享jquery的promise如何正确使用,希望能帮助到大家。

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

打开浏览器的控制台先。

  var defer = $.Deferred();  console.log(defer);

登录后复制

运行结果:

 jQuery的Promise如何正确使用

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

玩玩Deferred:

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

登录后复制

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

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

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

登录后复制

我们发现:

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

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

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

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

  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('在外部结束'); 

登录后复制

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

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

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

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

登录后复制

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

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

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

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

then方法:

  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);  })

登录后复制

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

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

  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);  })

登录后复制

always的用法

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

$.when的用法

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

 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);  });

登录后复制

jquery中没有像ES6中的race方法吗?就是以跑的快的为准的那个方法。对的,jquery中没有。

以上就是jquery中Deferred对象的常用方法了。

在上一篇和本篇当中,都是用一次性定时器来代替了异步请求进行数据处理。为什么没用ajax呢,不是因为麻烦,在这里要说一下ajax和Deferred的联系:

jquery的ajax返回一个受限的Deferred对象,也就是没有resolve方法和reject方法,不能从外部改变状态,既然是Deferred对象,那么我们上面讲到的所有特性,ajax也都是可以用的。比如链式调用,连续发送多个请求:

req1 = function(){  return $.ajax(/* **** */);}req2 = function(){  return $.ajax(/* **** */);}req3 = function(){   return $.ajax(/* **** */);}req1().then(req2).then(req3).done(function(){ console.log('请求发送完毕'); });

登录后复制

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一致。

相关推荐:

promsie.all和promise顺序执行详解

JS 中使用Promise 实现红绿灯实例代码(demo)

关于promise对象的简单用法

以上就是jQuery的Promise如何正确使用的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2788807.html

(0)
上一篇 2025年3月8日 18:31:41
下一篇 2025年3月8日 18:31:49

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • ES6中Promise代码实例分析

    本文主要和大家分享es6中promise代码实例分析,希望大家更更好掌握promise的用法,感兴趣的朋友参考下吧,希望能帮助到大家。 废话不多说了,直接给大家贴代码了,具体如下所示: nbsp;html>    var a=0var…

    编程技术 2025年3月8日
    200
  • express与koa的使用对比

    express和koa都是服务端的开发框架,服务端开发的重点是对http request和http response两个对象的封装和处理,应用的生命周期维护以及视图的处理等。 提到Node.js开发,不得不提目前炙手可热的2大框架expre…

    2025年3月8日
    200
  • jquery鼠标悬停导航下划线滑出实例分享

    本文主要为大家详细介绍了jquery鼠标悬停导航下划线滑出效果,菜单鼠标悬停出现下划线,向两边扩展的效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。 本文实例为大家分享了jquery鼠标悬停导航下划线滑出效果的具体…

    编程技术 2025年3月8日
    200
  • jquery实现PC端轮播图代码

    最近其他项目不是很忙,被安排给公司的官网项目做一个新的页面项目里既然已经用到了jquery,那就索性用jquery写一个轮播图吧。本文主要给大家讲述了用jquery如何写出一个pc端的轮播图效果的实例,有兴趣的朋友参考下。 现在把自己写的轮…

    2025年3月8日
    200
  • jQuery子元素过滤选择器如何使用

    本文主要为大家详细介绍了jquery选择器之子元素过滤选择器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。           Untitled Document             p, span, …

    编程技术 2025年3月8日
    200
  • ES6 Promise 扩展always方法实例详解

    本文主要介绍es6 promise 扩展always方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 ES6添加了Promise对象,成功时在then中处理,失败则在catch中处理,但有…

    编程技术 2025年3月8日
    200
  • JS和jQuery注册信息的验证功能实现代码

    用js和jquery实现注册信息的验证功能的效果是一样的。本文通过实例代码给大家分享了基于js+jquery实现的注册信息验证功能,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友参考下吧,希望能帮助到大家。 HTML代码  请填写注册…

    编程技术 2025年3月8日
    200
  • 在vue-cli中使用路由的方法

    本文主要和大家介绍在vue-cli中使用路由的方法,给大家做个参考,希望能帮助大家正确在vue-cli中使用路由。 1.首先npm中是否有vue-router 一般在vue-cli的时候就已经下载好了依赖包了 2.使用vue的话正常的需要涉…

    2025年3月8日
    200
  • jQuery使用zTree插件实现可拖拽的树代码分享

    在目前接触到的树插件中,我觉得ztree比较简单,也容易上手。有一次业务需求是将某对象分组树上的对象可以随意拖拽,相当于改变了对象的分组,因此我用到了ztree,对其进行了一些列学习。 本文主要介绍js使用zTree插件实现可拖拽的树示例,…

    2025年3月8日
    200
  • jquery代码实现鼠标点击文字特效

    今天在【幻想’s blog】看到一段比较喜欢的鼠标点击文字特效js代码,本文主要和大家介绍一个有意思的鼠标点击文字特效jquery代码,需要的朋友可以参考下,希望能帮助到大家。 只需将如下JS代码放到 以上就是jquery代码实…

    2025年3月8日
    200

发表回复

登录后才能评论