简介:
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 特点
-
未决阶段的处理函数是同步的,会立即执行
-
如果当前的promise是未决的,得到的新的promise是挂起状态
-
在未决阶段的处理函数中,如果发生未补获的错误,会将状态推向rejected,并且会被catchable捕获
-
一旦状态推向了已决阶段,无法再去做任何的改变
-
thenable和catchable函数是异步的,就算会立即执行,也是会加入等待队列中,加入微队列
-
pro.then可以只添加thenable函数,pro.catch可以单独添加catchable函数
-
如果前面的promise的后续处理,返回的是一个promise,则返回的promise状态和后续处理返回的promise状态保持一致
-
Promise并不是消除回调,只是让回调变得更简单,变更可控
构造函数成员(静态成员)
- resolve()
const pro = Promise.resolve(1)
等同于
推向了完成阶段的成功状态
const pro = new Promise((resolve,reject) => {
resolve(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
- all(arr)
这个方法会返回一个新的promise对象,如果里面所有的promise对象都成功才会触发,一旦有一个失败,则该promise对象为失败 - ace(arr)
当参数中的任意一个promise对象完成时候,就马上回去使用完成的这个promise对象的结果,不管这个结果成功还是失败
原型成员(实例成员)
-
then方法
const pro = new Promise((resolve,reject)=>{ }) //注册一个后续处理函数 pro.then(data => { //当promise为resolved状态时运行该函数 },err => { //当promise为rejected状态时运行该then的第二个参数 })
-
catch()
注册一个后续处理函数,当promise为rejected状态是运行该函数,习惯把失败写在catch中
pro.catch(err=>{
console.log(err)
})
- finally()
ES2018出来的,没有参数的,当promise为已决状态时运行该函数 先写先执行 后写后执行
const pro = new Promise((resolve,reject) => {
resolve(1)
})
pro.finally(() => {
console.log('finally')
})
pro.then(result => {
console.log('then',result * 2)
})