ES6:Promise

简介:

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

ES6将某一件事情可以发生异步操作的时候,分为了2个阶段 unsettled 和 settled
unsettled 未决阶段
settled 已决阶段
事情总是从 未决阶段逐步发展到已决阶段,并且,未决阶段拥有控制通往已决阶段的能力。
es6将程序分为了三种状态 pending resolved rejected
pending:挂起(等待) 处于未决阶段,表示事情还是在挂起,最后的结果没有出来
resolved:已成功 处于已决阶段,表示整个事情已经出现结果,并且可以按照正常的逻辑进行下去的结果
rejected:已失败 处于已决阶段,表示整个事情已经出现结果,并且是一个无法按照正常逻辑进行下去的结果
未决阶段有权利决定事情的走向,未决阶段可以决定事情走向最终的状态
把事情推向resolved 状态的过程,可能会传递一些数据
把事情推向resolved 状态的过程,可能会传递一些数据,这些数据一般为错误信息
无论是哪个阶段还是状态,都是不可逆的
当事情已经到达已决阶段后,通常要进行后续的处理,不同的已决解决,决定了不同的后续处理
resolved 这是一个正常的已决状态,后续处理表示为 thenable
rejected 这是一个非正常的已决状态,后续处理表示为 catchable
后续的处理可能会有多个,因此会形成任务队列,这些后续处理会按照顺序,当达到对应的状态后依次执行

基本用法:

ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。

下面代码创造了一个Promise实例。

const pro = new Promise((resolve,reject) => {
		//未决阶段
		resolve();  // 通过调用resolve函数将promise推向已决阶段的resolve状态
		//reject(); // 通过调用reject函数将promise推向已决阶段的reject状态
		//resolve 和 reject 只能使用一个,如果使用了多个,也只有第一个有用
		//传递参数只能有一个,表示推向状态的数据
		//resolve({})或者reject()、 throw 作用一样都是推向失败
	})

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

resolve函数的作用是将Promise对象的状态从未决阶段,推向已决阶段 成功状态
reject函数的作用是将Promise对象的状态从未决阶段,推向已决阶段 已失败状态

Promise 特点

  1. 未决阶段的处理函数是同步的,会立即执行

  2. 如果当前的promise是未决的,得到的新的promise是挂起状态

  3. 在未决阶段的处理函数中,如果发生未补获的错误,会将状态推向rejected,并且会被catchable捕获

  4. 一旦状态推向了已决阶段,无法再去做任何的改变

  5. thenable和catchable函数是异步的,就算会立即执行,也是会加入等待队列中,加入微队列

  6. pro.then可以只添加thenable函数,pro.catch可以单独添加catchable函数

  7. 如果前面的promise的后续处理,返回的是一个promise,则返回的promise状态和后续处理返回的promise状态保持一致

  8. Promise并不是消除回调,只是让回调变得更简单,变更可控

构造函数成员(静态成员)

  1. resolve()
 const pro = Promise.resolve(1)
	 等同于
	 推向了完成阶段的成功状态
	 const pro = new Promise((resolve,reject) => {
		resolve(1) 
	 })
  1. reject()
 const pro = Promise.reject(1)
	// 等同于 推向了完成阶段的失败状态
	 const pro = new Promise((resolve,reject) => {
 		reject(1)
	 })
	// 特殊情况:如果传递的是Promise,则直接返回传递的Promise对象(原封不动的)
	 const pro = new Promise((resolve,reject) => {
		resolve(123)
	 })
	 const pro2 = Promise.resolve(pro)
	 console.log(pro2 === pro) //true
  1. all(arr)
    这个方法会返回一个新的promise对象,如果里面所有的promise对象都成功才会触发,一旦有一个失败,则该promise对象为失败
  2. ace(arr)
    当参数中的任意一个promise对象完成时候,就马上回去使用完成的这个promise对象的结果,不管这个结果成功还是失败

原型成员(实例成员)

  1. then方法

    const pro = new Promise((resolve,reject)=>{ })
    //注册一个后续处理函数
    pro.then(data => {
        //当promise为resolved状态时运行该函数
    },err => {
       //当promise为rejected状态时运行该then的第二个参数
    })  
    
  2. catch()
    注册一个后续处理函数,当promise为rejected状态是运行该函数,习惯把失败写在catch中

pro.catch(err=>{
    console.log(err)
 })
  1. finally()
    ES2018出来的,没有参数的,当promise为已决状态时运行该函数 先写先执行 后写后执行
const pro = new Promise((resolve,reject) => {
 	resolve(1)
 })
 pro.finally(() => {
 	console.log('finally')
 })
 pro.then(result => {
 	console.log('then',result * 2)
 })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值