Promise对象
概述
Promise是异步编程的一种解决方案。
从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。
Promise对象两个特点:
- 对象的状态不受外界影响。有三种状态:
pending
:挂起(等待) 处于未决阶段 表示事情还在挂起种,最终结果没有出现
resolved
:已成功 , 处于已决阶段
rejected
:已失败 ,处于已决阶段 - 一旦状态改变,就不会再变,任何时候都可以得到这个结果
注意:无论是状态还是阶段都是不可逆的
resolved 一个正常的已决阶段下的状态,后续处理为thenable
rejected 一个非正常的已决阶段下的状态,后续处理为catchable
状态的缺点:
- 无法取消 Promise ,一旦新建它就会立即执行,无法中途取消
- 如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。
- 当处于 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
Promise解决异步的优点
回调地狱:某个异步操作需要等待之前的异步操作完成以后,无论是回调还是函数,都会陷入不断的嵌套 (简单来说就是无数的嵌套函数)
Promise的出现,可以将异步操作以同步的流程表达出来,很好的解决了回调地狱
基本用法
Promise对象是一个构造函数,该函数有两个参数:
- resolve:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去
- reject:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去
const pro = new Promise((resolve,reject)=>{
// 未决阶段
// 通过调用resolve函数将promise推向已决阶段中的resolved状态
//
// resolve和reject只能写一个,如果使用多个则只有第一个有效
// 传递参数只能有一个,可以是任意数据类型的,表示推向状态的数据
reject(123)
// resolve({})
})
// console.log(pro)
pro.then(data=>{
// thenable promise已经是已决阶段的resolved状态
console.log(data)
},err=>{
// catchable promise已经是已决阶段的rejected状态
console.log(err)
})
then 方法
then 方法接收两个函数作为参数,第一个参数是 Promise 执行成功时的回调,第二个参数是 Promise 执行失败时的回调,两个函数只会有一个被调用。
- then()方法是Promise原型上定义的方法
- then()方法支持链式调用,上一个then()方法调用后返回的结果会传给下一个then方法中。
- 第一个参数是resolved状态的回调函数
- 第二个参数(可选)是rejected状态的回调函数
原型成员(实例方法)
- Promise.prototype.then(resolved[,rejected]):为Promise实例添加状态改变时的回调函数
- Promise.prototype.catch(rejection):用于指定发生错误时的回调函数(只要Promise方式错误就可以捕获)
- Promise.prototype.finally():用于指定不管 Promise 对象最后状态如何,都会执行的操作(ES2018)
构造函数成员(静态成员)
- Promise.resolve([*]):将现有对象转为 Promise 对象
- Promise.reject(reason):返回一个新的 Promise 实例,该实例的状态为rejected
特殊情况:resolve和reject两个静态成员如果传递的是promise,则直接返回一个promise对象
- Promise.all([new Promise,…]):这个方法会返回一个新的promise对象,如果里面所有的promise对象都成功了才会触发,一旦有一个失败则该promise失败
- Promise.race([new Promise,…]):返回一个全新的promise对象,当数组中任意一个promise对象完成时,就马上回去使用完成好的promise对象的结果,不管这个 结果是成功还是失败