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

promise(特点,项目中如何应用)

一、Promise

Promises的概念是由CommonJS小组的成员在Promises/A规范中提出来的。一般来讲,有以下的名词约定:
**promise(首字母小写)**对象指的是Promise实例对象
Promise首字母大写且单数形式,表示Promise构造函数
Promises首字母大写且复数形式,用于指代Promises规范

二、什么是promise

Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
从语法上说,promise 是一个对象,从它可以获取异步操作的的最终状态(成功或失败)。
**Promise是一个构造函数,**对外提供统一的 API,自己身上有all、reject、resolve等方法,原型上有then、catch等方法。

三、Promise对象有以下两个特点。

(1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称Fulfilled)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

Promise也有一些缺点。首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

三、使用 new 来创建一个promise对象。

Promise接受一个「函数」作为参数,该函数的两个参数分别是resolve和reject。这两个函数就是就是「回调函数」
**resolve函数的作用:**在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

四、Promise构造函数的超能力

Promises写法的本质就是把异步写法写成同步写法。传入Promise构造函数的函数参数会第一优先执行,无论这个函数多么的繁复,有多少层回调,有多少秒的计数器,统统都会最优先执行。
也就是说,我们只要new了一个Promise(),那么Promise构造函数的函数参数其实是同步代码,但是.then比较特殊,.then会等到promise对象实例有了结果(resolved或者rejected),.then()里面代码才会执行。链条上的每一个.then都会等前面的promise有了结果才会执行,Promise构造函数的这个超能力是Promises系统的威力之源

五、Promise的api

all()方法:
Promise 的 all 方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。
reject()方法:
我们通过 resolve 方法把 Promise 的状态置为完成态(Resolved),这时 then 方法就能捕捉到变化,并执行“成功”情况的回调。
而 reject 方法就是把 Promise 的状态置为已失败(Rejected),这时 then 方法执行“失败”情况的回调(then 方法的第二参数)
then()方法
then 方法就是把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。
而 Promise 的优势就在于这个链式调用。我们可以在 then 方法中继续写 Promise 对象并返回,然后继续调用 then 来进行回调操作。
可有两个参数,第一个是成功 resolve 调用的方法,第二个是失败 reject 调用的方法
下面做一个买笔写作业上交的演示,它们是层层依赖的关系,下一步的的操作需要使用上一部操作的结果。(这里使用 setTimeout 模拟异步操作),正式开发可以用 ajax 异步

相关文章:

  • vux 获取后台数据
  • async,await(特点,项目中应用)
  • Horizon View 7 发布Win10桌面二:即时克隆桌面池配置
  • 系统恢复
  • generator(特点,项目应用)
  • Java日期类
  • 设计一个算法,判断玩家是否赢了井字游戏
  • ES6的数组方法详解(ES5新增)
  • 【转载】CSS 入门精要(四)
  • ES6新增数组方法
  • 心情随笔
  • includes()方法和indexOf()方法数组去重
  • KVM之网桥创建(ubuntu 环境)
  • orcale创建临时表空间,表空间,创建用户
  • 事件监听
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • CentOS 7 修改主机名
  • Django 博客开发教程 8 - 博客文章详情页
  • es6要点
  • idea + plantuml 画流程图
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 开源地图数据可视化库——mapnik
  • 坑!为什么View.startAnimation不起作用?
  • 深度学习在携程攻略社区的应用
  • 实现菜单下拉伸展折叠效果demo
  • 一道面试题引发的“血案”
  • 移动端解决方案学习记录
  • 走向全栈之MongoDB的使用
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​插件化DPI在商用WIFI中的价值
  • #AngularJS#$sce.trustAsResourceUrl
  • #图像处理
  • #在 README.md 中生成项目目录结构
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (4.10~4.16)
  • (9)STL算法之逆转旋转
  • (C#)获取字符编码的类
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Python) SOAP Web Service (HTTP POST)
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)fiber的基本认识
  • (二)Linux——Linux常用指令
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (六)vue-router+UI组件库
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (原創) 未来三学期想要修的课 (日記)
  • (转)3D模板阴影原理
  • ./configure,make,make install的作用(转)