我将围绕以下几个问题来讲解promise
1、为什么需要Promise?Promise解决了什么问题?
2、Promise作为构造函数,需要什么参数?各个参数有什么用?
3、Promise的实例有什么状态,如何改变实例的状态?
4、promise有哪些方法?及其使用方法。
一、为什么需要Promise?
在开发中经常会遇到一种场景,即第一次发起请求,但第二次发起请求就需要拿到第一次请求响应的数据,第三次发起请求需要拿到第二次请求响应的数据,以此类推,最终形成了常说的回调地狱。因为XMLHttpRequest对象请求都是异步的所以我们用定时器模仿回调地狱:
假设每一次调用定时器都是在发起一次异步请求,id,username,age是每次请求返回的数据
const time = 1000
setTimeout(()=>{
const id = '9999' // 第一次返回的数据,假设这个id就是返回的数据
setTimeout(()=>{
const username = '张三' // 第二次返回的数据,假设username就是返回的数据
setTimeout(()=>{
const age = 26 // 第三次返回的数据,以此类推,就是地狱回调
},time)
},time)
},time)
回调地狱产生的问题:开发体验差,不利于维护。而Promise解决了这个问题。
二、Promsie
Promise是一个构造函数它的参数是一个函数,这个函数又包含两个函数形参。
new Promise((resolve,reject)=>{
resolve('success') //
//reject('failed')
})
三、Promise实例
Promise实例包含三个属性
1、state:pending/fulilled/rejected
这个状态是由Promise决定的,在未调用resolve或者rekected方法之前实例的状态是pending,如果在Promise当中调用resolve方法那么状态就是fulilled,同样调用的是rejected方法那么状态就是rejected,还有一种情况如果Promose函数里面代码出错了,那么实例状态也是rejected。
2、result:返回的是Promise中调用参数函数传的值
3、prototype:继承自Promise构造函数里面有很多方法后面介绍
四、Promise实例具备的方法
1、then(resolve,rejected):
a、then只有当实例状态发生改变时调用,也就是Promise中调用resolve、rejected。
b、then可以返回当前的实例,并且如果当前的实例状态为rejected,那么可以变成fulilled。返回值将作为result属性值,它的默认值是undefined。
2、catch(err)
a、catch方法会捕获then里面的错误,无论是resolve还是rejected回调中产生的错误catch都会捕获。
b、然而实际开发中我们一般不写rejected回调,这是后catch也可以捕获Promise中产生的错误或者rejected回调传的参数