Promise 对象介绍和核心API介绍
Promise 是异步编程的一种解决方案;所谓Promise 简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
- 从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。
- Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
一、Promise 对象属性介绍
1.1、Promise对象的状态
Promise的状态其实是实例对象中的一个内置属性(PromiseState),不能够对该属性做直接的操作(对象的状态不受外界影响)。
Promise的三种状态:
- pending:进行中、未定的状态
- fullfilled/resolved:已成功
- rejected:已失败
只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
1.2、Promise的状态的改变
Promise 对象的状态改变,只有两种可能:
- 从pending变为fulfilled;;pending->fulfilled
- 从pending变为rejected;;pending->rejected
只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。
如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
1.3、传递执行结果 promiseResult
Promise 包装的异步操作,无论执行成功或执行失败,都需要将执行结果传递给相应的回调函数进行处理;这里就需要使用到 promiseResult 属性了。
Promise 对象的值就是实例对象中的另外一个属性promiseResult,该值保存了异步任务成功/失败的结果,供then()方法的回调函数接受异步操作的执行结果。
二、Promise 对象中重要的API介绍
2.1、Promise 对象的构造函数
Promise 构造函数接受一个函数(执行器函数)作为参数,该函数的两个参数分别是resolve和reject。
它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
- Promise的构造函数:Promise(excutor){}
- —-excutor函数:执行器(resolve,reject)=>{}
- ——-resolve函数:内部定义成功时,调用的函数 value=>{}
- ——-reject函数:内部定义失败时,调用的函数 reason=>{}
说明:executor 会在 promise 内部立即同步调用,异步操作在执行器中执行。
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(reason);
}
});
- resolve函数:将Promise对象的状态从“pending”变为“resolved”;在异步操作成功时调用,并将异步操作的结果,作为参数value传递出去。
- reject函数:将Promise对象的状态从“pending”变为“rejected”;在异步操作失败时调用,并将异步操作报出的错误,作为参数error/reason传递出去。
Promise实例生成以后,可以用then()方法分别指定resolved状态和rejected状态的回调函数。
2.2、Promise 绑定回调函数 then()方法
Promise 实例生成以后,可以用then()方法分别指定resolved状态和rejected状态的回调函数。
then方法可以接受两个回调函数作为参数。
- 第一个回调函数onResolved()是Promise对象的状态变为resolved时调用
- 第二个回调函数onRejected()是Promise对象的状态变为rejected时调用
- 这两个函数都是可选的,不一定要提供。它们都接受Promise对象传出的值作为参数
Promise.prototype.then 方法形式:
promise.then(function(value) {
//onResolved函数:成功的回调函数(value)=>{}
}, function(reason) {
//onRejected函数:失败的回调函数(reason)=>{}
});
Promise 封装异步操作的常规用法示例:
// 创建一个新的p对象promise
const p = new Promise((resolve, reject) => { // 执行器函数
// 执行异步操作任务
setTimeout(() => {
const time = Date.now()
// 如果当前时间是偶数代表成功,否则失败
if (time % 2 == 0) {
// 如果成功,调用resolve(value)
resolve('成功的数据,time=' + time)
} else {
// 如果失败,调用reject(reason)
reject('失败的数据,time=' + time)
}
}, 1000);
})
// 绑定回调函数
p.then(
value => { // 接收得到成功的value数据 onResolved
console.log('成功的回调', value) // 成功的回调 成功的数据,time=1615015043258
},
reason => { // 接收得到失败的reason数据 onRejected
console.log('失败的回调', reason) // 失败的回调 失败的数据,time=1615014995315
}
)
- .then() 和执行器(executor)同步执行。
- .then() 中的回调函数异步执行。
2.3、Promise 只绑定失败的回调函数 catch()方法
Promise.prototype.catch 方法: (onRejected) => {}。
只绑定失败状态的回调函数;相当于 then()方法定义为 then(undefined, onRejected)
。