Promise学习
一、Promise介绍与基本使用
Promise
是ES6引入的异步编程的新解决方案。在语法上来说Promise是一个构造函数,在功能上来说Promise对象用来封装异步操作(如node.js下的fs模块操作、数据库操作MySql等、ajax网络请求和定时器等)并可以获取其成功或失败的结果。
1.1、使用Promise的优点
①指定回调函数的方式更加灵活:旧的方式必须在启动异步任务前指定,而promise则是启动异步任务→返回promie对象→给promise对象绑定回调函数(甚至可以在异步任务结束后指定/多个)。
②支持链式调用问题,可以解决回调地狱问题:回调地狱不仅不便于阅读,还不便于异常处理,而Promise则可以解决这个问题。
//经典回调地狱问题
asyncFunc1(opt, (...args1) => {
asyncFunc2(opt, (...args2) => {
asyncFunc3(opt, (...args3) => {
//...
});
});
});
1.2、Promise的基本使用
Promise是构造函数,因此先要实例化。实例化时需要接收一个函数形式的参数,该函数有两个形参:resolve
和 reject
,resolve和reject都是函数类型的数据,当异步任务成功时调用resolve,失败时调用reject。实例化并封装异步操作后,再调用 then
方法,该方法接收两个函数形式的参数,第一个函数是对象成功时的回调,第二个是失败时的回调。
const p = new Promise((resolve,reject) => {
setTimeout(() => {
let n = Math.random();
if(n <= 0.3) {
resolve(n); //调用后将promise对象的状态设置为‘成功’,把成功的结果传给resolve函数
}else {
reject(n); //调用后将promise对象的状态设置为‘失败’,把失败的结果传给reject函数
}
},1000)
});
p.then((value) => {
alert('恭喜中奖!n的值是:' + value);
}, (reason) => {
alert('再接再厉!n的值是:' + reason);
})
1.3、Promise的状态属性
Promise的状态属性是指实例对象中的一个属性 PromiseState
,它仅有三种值:pending
(未确定)、resolved
(或 fulfilled
)(成功)、rejected
(失败)。其中pending是初始化的默认值。Promise的状态改变的情况只有两种:①pending变成resolved;②pending变成rejected,即成功和失败的状态不能互相转变。无论pending是变为成功还是失败,都会有一个结果,成功的结果数据一般称为 value
,失败的结果数据一般称为 reason
。
1.4、Promise的结果属性
Promise的结果属性是指实例对象中的另一个属性 PromiseResult
,它保存的是对象(异步任务)成功或失败的结果。只有resolve
和 reject
函数可以修改这个属性的值,在后续的 then
方法中可以对该值进行操作。
1.5、Promise的工作流程
Promise的工作流程如下图: