Promise的使用
一、Promise是什么?
1:Promise是一个构造函数,用来异步编程的一种解决方案;
主要用于异步计算、解决回调地狱问题
没有剥夺函数return的能力,因此无需层层回调
可以在对象之间传递和操作promise,帮助我们处理队列
可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
2:异步常见的场景:事件监听、回调等
二、Promise的状态
Promise有三种状态:
1:pending(待定)初始状态
2:resolved(完成fulfilled)操作成功
3:rejected(失败)操作失败
Promise对象状态的改变只有两种情况:
1:pending - resloved (初始状态到操作成功)
2:pending - rejected (初始状态到操作失败)
#promise的状态改变,就会触发then()里的响应函数处理后续步骤,
Promise对象有以下两个特点:
1:Promise对象不受外界影响:
只有异步操作的结果才会决定Promise的状态,任何其他操作都不会改变这个结果。
2:Promise的状态一经改变,状态将不会再改变,任何时候都能得到这个结果
只要状态改变了,则状态就凝固了,不会在变了,会一直保持这个结果;就算状态已经改变了,你再对Promise添加回调函数,也会立即那到这个结果。
这个与事件不同,事件一但错过了,你再去监听它,是得不到结果的
三、Promise的基本使用
1:Promise构造函数接受一个函数作为参数,两个参数分别为resolve和reject方法
let P = new Promise(function(resolve,reject){ if(/*如果异步操作成功*/) { resolve('操作成功') } else { reject('操作失败') } }) //一、 promise对象 then方法中有两个参数,分别为函数,第一个参数是操作成功函数,第二个参数是操作失败函数 P.then(function(res) { // 返回操作成功的响应函数 },function(err){ // 返回操作失败的响应函数 }) // 二、promise对象除了then方法,还有一个catch方法,来捕获操作错误 p.then(res => {}).catch(err => {})
###注意:当我们new了一个对象,并没有调用它,我们传进的函数已经执行了;所以,我们用Promise时一般会包裹在函数中,在需要的时候调用这个函数。
2:Promise有一些缺点
#无法取消promise,一旦新建他它就会立即执行,无法中途取消
#如果不设置回调函数,promise内部抛出的错误,不会反应到外部
#当处于pending阶段时,无法判断当前什么状态
四、Promise的常用api
1:Promise.resolve()
2:Promise.reject()
3:Promise.prototype.then()
4:Promise.prototype.catch()
5:Promise.all([P1, P2, P3])
all()可以将多个promise方法封装成一个新的promise对象
全部完成后才会进入then()方法,返回的是一个数组;否则会进入catch()方法 ,返回的是最先reject的值
6:Promise.race([P1, P2, P3])
里面那个结果捕获的快,就返回那个结果,不管结果本身是成功状态还是失败状态;实际项目中使用较少