Promise的使用
Promise解决的问题:回调地狱,promise是回调的一种解决方案
Promise的状态:fulfilled、rejected、pedding
优点:Promise解决了回调地狱的问题,避免函数嵌套,使得代码难以理解。 缺点:Promise的状态一旦发生变化,就不能在改变。
Promise接收一个函数作为参数,里面有两个参数,分别是resolve、reject,前者可以将pedding状态变为fulfilled,并将结果传递出去,当调用.then的成功回调可以获得结果,后者可以将fulfilled状态变成pedding,当调用.then或.catch的失败回调可以获取失败的结果。
const p = new Promise((resolve,reject)=>{
resolve(200)
})
p.then(res=>{console.log(res)})
//打印出 200
当p为fulfilled状态时,调用.then且不指定成功回调时,程序并不会报错如下:
const p = new Promise((resolve,reject)=>{
resolve(200)
})
p.then(undefined)
//程序不会报错
当p的状态为fulfilled时,不指定失败的回调时,程序会抛出异常
const p = new Promise((resolve,reject)=>{
reject(200)
})
p.then(res=>{
console.log(res)
})
//Uncaught (in promise) 200
Promise.resolve()
用于返回一个状态为fulfilled或rejected的实例,如果其参数是一个状态rejected的Promise实例,那么将返回rejected,其它情况都是fulfilled
Promise.resolve(100).then(res=>{
console.log(res) //输出100
})
传递一个状态为fulfilled实例
Promise.resolve(Promise.resolve(100)).then(res=>{
console.log(res) //100
})
如果传递的是一个状态为rejected的Promise实例,那么将调用失败的回调
Promise.resolve(Promise.reject(100)).then(res=>{
console.log(res)
},err=>{
console.log('error',err) //error 100
})
Promise.reject()
用于返回一个状态为rejected的Promise实例,那么一定调用失败的回调函数
Promise.reject(100).catch(res=>{
console.log(res) //100
})
Promise.reject(Promise.resolve(100)).catch(res=>{
console.log(res) //100
})
Promise.reject(Promise.reject(100)).catch(res=>{
console.log(res) //100
})
promise.all()
传入一个数组,数组中包含所有Promise实例,当所有的实例的状态都是fulfilled的时候,那么将调用成功的回调并返回一个所有成功结果的数组。如果其中一个为rejected那么将返回失败的结果,不是一个数组
const p = Promise.resolve()
const p1 = Promise.resolve(200)
const x = Promise.all([p,p1])
x.then(res=>{
console.log(res) // [undefined,200]
})
const p = Promise.resolve()
const p2 = new Promise((resolve,reject)=>{
setTimeout(() => {
reject(100)
}, 200);
})
const p1 = new Promise((resolve,reject)=>{
setTimeout(() => {
reject(150)
}, 100);
})
const x = Promise.all([p,p2,p1])
x.then(res=>{
console.log(res)
},error=>{
console.log(error) //150
})
Promise.race
const p = Promise.race([p1, p2, p3]);
只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。
如何改变Promise的状态?
resolve()
reject()
抛异常(状态为pedding变为reject)
new Promise((resolve,reject)=>{
throw new Error(111)
}).catch(err=>{
console.log(err)
})