什么是Promise
Promise是js中的异步解决方案,在没有Promise之前也有异步编程,比如回调函数,事件,定时器。这些都可以做异步编程,而有了Promise之后,在js中异步编程将变得统一而规范。
Promise可以看做是一个代码盒子,在这个盒子里面的代码将会是异步执行的代码(也就可能是在未来才会有结果的的一个事件),从我们写代码的角度来看,Promise就是一个对象,这个对象可以获取里面异步操作的消息,然而Promise提供了统一的API, 各种异步操作,怎么获取状态...等等,都调用这个对象的API方法即可。
Promise的特点
Promise的状态不受外界影响,Promise对象代表异步操作,有三种状态: padding(进行中)、Resoleve(已完成)、Rejected(已失败)。 当Promise执行了后,状态就只有两种了,要么成功,要么失败。而这个“成功”和“失败”外界是没法改变的,只能他自己内部处理。
Promised的缺点
(1)无法取消Promise, 一旦新建就会立即执行,无法中途取消
(2)Promise内部抛出的错误,只能通过回调函数处理,并不会反应到到外部
(3)状态只有执行执行完成才能获取(成功或者失败),无法获取中间的执行过程状态。
基本用法
Promise就是一个构造函数,接收一个函数作为参数,这个函数有两个参数,resolve和reject
resolve 成功的回调
reject 失败的回调
获取成功的结果用then() 方法 , 接收一个回调函数,参数是成功的结果
获取失败的结果用catch()方法 , 接收一个回调函数,参数是错误的结果(通常是错误信息)
无论成功或者失败都会执行的finally()方法
var promise = new Promise((resolve,reject)=>{
// code 在这里写需要异步操作的代码
if(true){
resolve('成功了')
}else{
reject('到这里就是失败了');
}
})
// 以下返回的都是当前promise对象,所以就可以链式调用
promise.then(res=>{
console.log(res) // 成功了
}).catch(err=>{
console.log(err) // 到这里就是失败了
}).finally(()=>{
console.log('我都执行')
})
其他方法
Promise.all()
执行一组Promise, 全部执行完才会到then方法里面,有一个执行失败了就到catch方法,
then()的的参数是全部执行成功的结果,顺序和传入的数组参数一致。
var p1 = new Promise((resolve,reject)=>{
resolve('p1')
})
var p2 = new Promise((resolve,reject)=>{
resolve('p2')
// reject('no p2')
})
var p3 = new Promise((resolve,reject)=>{
resolve('p3')
})
Promise.all([p1,p2,p3]).then(res=>{
console.log(res) // res就是对应 [p1,p2,p3] 返回的结果 ['p1', 'p2', 'p3']
}).catch(err=>{
console.log(err) //只要有一个reject了,就会到这个catch里面来
})
Promise.race()
和all()使用方式相同,也是执行一组Promise, 但是结果不同,一组Promise中谁先返回,结果就是谁
var r1 = new Promise((resolve,reject)=>{
setTimeout(()=>{ resolve('r1') },3000)
})
var r2 = new Promise((resolve,reject)=>{
setTimeout(()=>{ resolve('r2') },2000)
})
var r3 = new Promise((resolve,reject)=>{
setTimeout(()=>{ resolve('r3') },1000)
})
Promise.race([r1,r2,r3]).then(res=>{
console.log(res)
}).catch((err)=>{
console.log(err)
})
Promise.resolve()
返回一个成功状态的promise对象
Promise.reject()
返回一个失败状态的promise对象