Promise
Promise是ES6提供的类,为了处理复杂的异步任务的。
状态
Promise有pending
、fulfilled
、rejected
三个状态,状态转变不可逆。
pending
: 初始状态
fulfilled
: 成功状态
rejected
: 失败状态
构建
我们可以通过new Promise((resolve,reject) => {})
构建一个Promise对象。
Promise的构造函数接收一个函数作为参数, 函数是同步执行的,称为起始函数,起始函数包含两个参数resolve、reject
,分别代表 Promise 成功和失败的状态。
API
then()
then
是Promise成功、失败的回调函数;
第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数;
catch()
catch
是Promise失败的回调函数;
finally()
finally
是无论成功失败,都会执行的回调函数。
const promise = new Promise((resolve,reject) => {
if(Math.random() < 0.5) {
// 调用 resolve 函数传递 成功参数
resolve('success')
} else {
// 调用 reject 函数传递 失败参数
reject('fail')
}
})
promise.then(r=>{
// then 接收 Promise resolve 成功的回调参数
console.log(r)
}).catch(error=>{
// catch 接收 Promise reject 失败的回调参数
console.log(error)
}).finally(()=>{
// 最后执行的参数, 注意没有入参
console.log('End')
})
all()
将多个Promise实例包装成一个新的Promise实例。
Promise.all([promise1, promise2, promise3]).then(r=>{
// 都成功会返回一个对应的数组 [promise1返回值,promise2返回值,promise3返回值]
}).catch(e=>{
// 只要有一个失败 就会返回 对应失败的返回值
})
只有当promise1、promise2、promise3 的状态都变成成功了,Promise.all的状态才会变成成功。返回的是一个数组,返回的数组只和传入的顺序有关,和那个先返回成功无关。
当其中有一个返回失败,Promise.all 就直接返回失败,有多个失败返回,只会返回先传入的那个。
race()
Promise.race([p1, p2, p3])
那个先返回就返回那个结果,不论是成功还是失败。
allSettled()
Promise.allSettled([p1, p2, p3])
返回一个新的Promise实例,不管成功还是失败,返回所有的结果。
[{status: 'rejected', reason: '1'}, {status: 'fulfilled', value: 2}]
async函数
async/await 是用来处理异步的方式,解决了异步调用嵌套地狱的问题。
async声明方法是异步,await等待一个异步方法执行结束
async function getSome() {
let res = await asyncFun()
}